2013-10-25 69 views
0

我試圖做這樣的事情:擴展列表和通用

public class MyClass1 implements IMyInterface{ 
    public boolean myMethod(){ 
     ... 
    } 
} 
public class MyClass2 implements IMyInterface{ 
    public boolean myMethod(){ 
     ... 
    } 
} 
public class MyList<T extends IMyInterface> extends ArrayList<T>{ 
    public T getSomething(){ 
     for (int i = 0; i < size(); i++) { 
      if (get(i).myMethod()) 
       return get(i); 
     } 
     return null; 
    } 
} 

所以我可以用它像這樣

public class MyClass3{ 
    public void doSomething(MyList<IMyInterface> list){ 
     ... 
    } 
} 
public class MyClass4{ 
    public MyList<MyClass1> list1; 
    public MyList<MyClass2> list2; 

    public MyClass4(){ 
     MyClass3.doSomething(list1); 
     MyClass3.doSomething(list2); 
    } 
} 

但我得到一個錯誤與此消息:該方法的doSomething (MYLIST)在類型MyClass3不適用於參數(MYLIST)

+2

讓我們看看你的實際代碼,而不是你想要的一些構成例子。該錯誤在* actual *代碼中。 – chrylis

回答

1

的方法定義

public void doSomething(MyList<IMyInterface> list){ 
     ... 
} 

說,這將只接受IMyInterfaceMyList。您無法將其傳遞給MyClass1 or MyClass2類型的MyListMyList<MyClass1>是原始類型MyList的子類型,但不是參數化類型MyList<IMyInterface>的子類型。

您需要使用bounded wildcard type來處理這種情況。您需要使參數接受類型IMyInterface or some subtype of IMyInterfaceMyList。因此,爲了使其工作,請將doSomething的方法參數更改爲此;

public void doSomething(MyList<? extends IMyInterface> list){ 
... 
} 
1

你需要使用wilcards

改變doSomething(MyList<IMyInterface> list)doSomething(MyList<? extends IMyInterface> list)

0

此簽名:

public void doSomething(MyList<IMyInterface> list) 

會盡快的arg的IMyInterface一個MyList匹配。 但是在你的代碼中,你試圖用MyListMyClass1來調用它,這是不一樣的。

修改簽名以使其匹配IMyInterface的所有MyList以及IMyInterface的子類型的所有MyList。要做到這一點,你必須使用像這樣的上限widcard:

public void doSomething(MyList<? extends IMyInterface> list)