あなたがやろうとしていることは非常に有用であり、私が書くコードでは非常に頻繁に行う必要があることがわかりました。使用例:
インターフェースがFoo
あり、package-privateのインスタンスを作成および管理するzorking
a ZorkingFooManager
を持つパッケージがあるとしますZorkingFoo implements Foo
。(非常に一般的なシナリオです。)
したがって、ZorkingFooManager
を含める必要private Collection<ZorkingFoo> zorkingFoos
がありますが、を公開する必要がありますpublic Collection<Foo> getAllFoos()
。
ほとんどのJavaプログラマーはgetAllFoos()
、実装する前に、新しいを割り当て、ArrayList<Foo>
そこからすべての要素を入力しzorkingFoos
、それを返すと考えてはいません。世界中の何百万ものマシンで実行されているJavaコードによって消費されるすべてのクロックサイクルの約30%は、作成後にガベージコレクションされたマイクロ秒であるArrayListsのそのような役に立たないコピーを作成することしかしていません。
この問題の解決策は、もちろん、コレクションをダウンキャストすることです。これを行う最良の方法は次のとおりです。
static <T,U extends T> List<T> downCastList( List<U> list )
{
return castList( list );
}
それは私たちを castList()
機能ます:
static <T,E> List<T> castList( List<E> list )
{
@SuppressWarnings( "unchecked" )
List<T> result = (List<T>)list;
return result;
}
中間 result
変数は、Java言語の倒錯のために必要です。
それはコーシャ使用しない場合でもので、@SuppressWarnings
上return
の文、それは余分が、この問題を解き、変数を「結果」ので、割り当てにそれを使用することが明らかに罰金です。(いずれにしても、コンパイラーまたはJITによって最適化する必要があります。)