2017-11-23 9 views
4

がどのように私はAを拡張し、Bを実装するオブジェクトのリストを作成するのでしょうか?Javaのジェネリックは、クラスAを拡張し、インタフェースB

public abstract class A{ 

} 

public interface B{ 

} 

このシナリオを検討して実装するオブジェクトのリストを作成しますか

List<? extends A implements B> list = new List(); 

私が知っているように感謝

+0

'class XXX extends A extends A {B}}を実装していますか? – haifzhan

+0

これはうまくいくはずです、ありがとう! –

答えて

0

が、これは、ワイルドカードのジェネリックではサポートされません。 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 
} 
0

また、「&」演算子を使用して、以下のようなタイプのパラメータとして、未知のクラスを宣言することができます。 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; 
    } 
} 
+0

私はこの回答が気に入っていますが、何らかの理由で同じ方法でリストを宣言することはできません。private List リスト –

+0

A&B>リストを拡張します。 –

+0

@JavaNoob私はあなたの目的はオブジェクトフィールドを宣言することだと思います。その場合は、Testクラスを汎用的にし、リスト型としてTypeパラメータを使用する必要があります: '' Test B&A ''' '' '' privateリスト list''' 。 –

関連する問題