我认为在编写代码时我犯了一些错误。 我有一个实现接口的类MyClass,现在我有一个通用接口List作为参数的方法。我想通过传递List来使用我的方法。我无法从列表转换为列表(我认为我可以)。那么,我该怎么做才能使我的代码工作?这里有一个例子:
List<MyClass> lista = returnMyClassList();
myMethod((List<Interface>) lista); //this doesn't work
//myMethod signature
public void myMethod(List<Interface> struttura);
感谢您的帮助。
答案 0 :(得分:3)
使用Interface
的上限作为类型:<? extends Interface>
。
这是一个可编译的代码,它使用JDK中的类来说明:
public static void myMethod(List<? extends Comparable> struttura) {}
public static void main(String[] args) {
List<Integer> lista = null;
myMethod(lista); // compiles OK
}
答案 1 :(得分:2)
您应该使用public void myMethod(List<? extends Interface> struttura);
。这样您就可以传递IS-A
Interface
的任何类型。您想了解Polymorpshism and generics
答案 2 :(得分:1)
您可以使用:
public void myMethod(List<? extends Interface> struttura);
为了同时获得List<Interface>
和List<MyClass>
答案 3 :(得分:1)
List<MyClass>
不是List<Interface>
的子类型,而是您收到错误
Accorind to java docs
给定两个具体类型A和B(例如,Number和Integer),MyClass与MyClass没有任何关系,无论A和B是否相关。 MyClass和MyClass的公共父是Object
所以将方法签名更改为
public void myMethod(List<? extends Interface> struttura){
}
并调用方法
List<MyClass> lista = returnMyClassList();
myMethod((lista);
答案 4 :(得分:0)
你不能这样做,因为你会做出一个你无法忍受的承诺。
当你从List<MyClass>
投射到List<Interface>
时,你会得到一个包含几个MyClass类型对象的列表,并将其扩展为一个类型,使(以及其他)以下承诺:
Interface get(int index)
- 你可以获得thpe接口的元素(没问题)boolean add(Interface e)
- 您可以添加Interface类型的任何元素(如果它是MyClass的子类型)(这是一个问题!)第二点是有问题的,因为基础列表仍然是MyClass
的列表,而不是一般的Interface
列表。您仍然可以在单独的变量中保存指向基础List的链接,并且可以在该列表上运行get
。如果您添加了Interface
类型的对象,但不是MyClass
,则可以从MyClass
获取此非List<MyClass>
。
正如所有其他答案和评论所指出的那样,正确的解决方案是类型List<? extends Interface>
。使用此类型,您仍然可以从列表中获取类型Interface
的对象(作为方法调用的返回值),但是您不能将任何内容放入列表中(用作方法调用的参数)。 / p>