2013-10-25 74 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)