List<T>
またはを取るコンストラクタを使用できますList<? extends T>
。クラスを考案し続ける:
class B extends Number{
public double doubleValue() { return 0; }
public float floatValue() { return 0; }
public long longValue() { return 0; }
public int intValue() { return 0; }
}
class C extends B{}
私は不自然な正当なコンストラクターをContrived
クラスに追加し、次のものを取りますList<? extends T>
:
public Contrived(List<? extends T> values)
{
this.values = values;
}
main
これにより、次のようなメソッドを書くことができます。
public static void main(String[] args)
{
List<C> bList = Arrays.asList(new C(), new C(), new C());
Contrived<B> ci = new Contrived<B>(bList);
}
List<C>
aのコンストラクターに a を渡すことができContrived<B>
ます。
正当な考案されたコンストラクターの別の設計は、次のようContrived
になりますList<T>
。
public Contrived(List<T> values)
{
this.values = values;
}
次の 2 つの例のように、型が一致する必要があるため、このようなコンストラクターは aList<C>
に対して a を許可しません。Contrived<B>
Contrived
public static void main(String[] args)
{
List<C> cList = Arrays.asList(new C(), new C(), new C());
Contrived<C> ci = new Contrived<C>(cList); // must match now
}
と
public static void main(String[] args)
{
List<B> bList = Arrays.asList(new B(), new B(), new B());
Contrived<B> ci = new Contrived<B>(bList); // must match now
}