51

基本クラスのコレクションを返すメソッドがあります。

import java.util.*;
class Base { }
class Derived extends Base { }

Collection<Base> getCollection()
{
    return Arrays.asList(new Derived(),
                         new Derived());
}

Arrays.asList( List<Derived>) の戻り値の型がメソッド ( ) の戻り値の型と一致しないため、これはコンパイルに失敗しますCollection<Base>。その理由は理解できます。ジェネリック型が異なるため、2 つのクラスは継承によって関連付けられていません。

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

コンパイラが Arrays.asList 呼び出しのジェネリック型を解決するときに、互換性のある別の型を使用するようにコンパイラに指示する方法はありますか? (私はこのパターンを使用しようとしており、この問題に遭遇し続けているので、それを機能させる方法があれば知りたいです.)

私はあなたが何かをすることができると思った

Collection<Base> getCollection()
{
    return Arrays.asList<Base>(new Derived(),
                               new Derived());
}

それ(Java 6)をコンパイルしようとすると、コンマに「)」が必要であるとコンパイラが不平を言います。

4

1 に答える 1

67

あなたの構文はほぼ正しいです。<Base>メソッド名の前に置きます。

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

Java 8

Java 8 では、ターゲット型推論が改善されているため、明示的な型引数は必要ありません。メソッドの戻り値の型は であるためCollection<Base>、型パラメーターは と推測されBaseます。

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

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

于 2013-04-03T22:32:36.490 に答える