2013-04-03 9 views
34

の戻り値の型を強制する方法はありますメソッドの戻り値の型と一致しません(Collection<Base>)。私はそれがなぜ起こるのか理解しています:ジェネリック型が異なるので、2つのクラスは継承によって関連しません。私は、基本クラスのコレクションを返すメソッドを持っては、Arrays.asList

Arrays.asListを使用せずにメソッドの戻り値の型を変更して、派生したオブジェクトの1つをBaseにキャストすることからコンパイラエラーを修正する多くの方法があります。

Arrays.asList呼び出しのジェネリック型を解決するときにコンパイラーに異なる互換性のある型を使用するように指示する方法はありますか? (私はこのパターンを使用しようと、この問題に実行し続けるので、それを動作させるための方法がある場合、私はそれを知っていると思います。)

私はあなたが

Collection<Base> getCollection() 
{ 
    return Arrays.asList<Base>(new Derived(), 
           new Derived()); 
} 
ような何かを行うことができると考えました

コンパイルしようとすると(java 6)、コンパイラはコンマで ')'が必要であると不満を表明します。

+3

アレイ。 asList –

答えて

47

構文はほぼ正しいです。 <Base>は、メソッド名の前に行く:

return Arrays.<Base>asList(new Derived(), 
          new Derived()); 

のJava 8

をするJava 8の場合、そのimproved target type inferenceで、明示的な型の引数は必要ありません。メソッドの戻り値の型はCollection<Base>なので、型パラメーターはBaseと推定されます。

return Arrays.asList(new Derived(), 
        new Derived()); 

明示的な型パラメータは、Java 7以下では引き続き必要です。 Java 8では明示的な型パラメータを指定できます。オプションです。

+0

うわー、これは一度も聞いたことがありません –

+0

Java 8では、パラメータを指定する必要があります。私はこれに「MyClass」のようなことをしました。 ビルダー()。someMethodWithGenericSignature(派生) 'またはそれに類するもの。 –

関連する問題