がどのように私はAを拡張し、Bを実装するオブジェクトのリストを作成するのでしょうか?Javaのジェネリックは、クラスAを拡張し、インタフェースB
public abstract class A{
}
public interface B{
}
このシナリオを検討して実装するオブジェクトのリストを作成しますか
List<? extends A implements B> list = new List();
私が知っているように感謝
がどのように私はAを拡張し、Bを実装するオブジェクトのリストを作成するのでしょうか?Javaのジェネリックは、クラスAを拡張し、インタフェースB
public abstract class A{
}
public interface B{
}
このシナリオを検討して実装するオブジェクトのリストを作成しますか
List<? extends A implements B> list = new List();
私が知っているように感謝
が、これは、ワイルドカードのジェネリックではサポートされません。 Typeジェネリックでこれを行うことができます。
public abstract class A{}
public interface B{}
public class Match extends A implements B{}
public class NotMatch1 implements B{}
public class NotMatch2 extends A{}
public class MyChecketList<T extends A&B> extends ArrayList<T>{}
public void use(){
List<Match> a = new MyChecketList<>();//valid
List<NotMatch1> b = new MyChecketList<>();//compiler error
List<NotMatch2> c = new MyChecketList<>();//compiler error
MyChecketList<Match> d = new MyChecketList<>();//valid
MyChecketList<NotMatch1> e = new MyChecketList<>();//compiler error
MyChecketList<NotMatch2> f = new MyChecketList<>();//compiler error
}
また、「&」演算子を使用して、以下のようなタイプのパラメータとして、未知のクラスを宣言することができます。 class XXX extends B implement A
を宣言することの利点は、子孫であるXXX
の制約だけでなく、そのようなクラスでもコードが動作することです。
import java.util.*;
interface A {};
class B {};
class Test {
public <T extends B & A> List<T> asList(Collection<T> elements) {
List<T> result = new ArrayList<>(elements.size());
for (T element : elements) result.add(element);
return result;
}
}
私はこの回答が気に入っていますが、何らかの理由で同じ方法でリストを宣言することはできません。private
A&B>リストを拡張します。 –
@JavaNoob私はあなたの目的はオブジェクトフィールドを宣言することだと思います。その場合は、Testクラスを汎用的にし、リスト型としてTypeパラメータを使用する必要があります: '' Test B&A ''' '' '' privateリスト
'class XXX extends A extends A {B}}を実装していますか? – haifzhan
これはうまくいくはずです、ありがとう! –