5

我想我在编写代码时犯了一些错误。我有一个实现接口的 MyClass 类,现在我有一个通用的接口列表作为参数的方法。我想通过传递一个列表来使用我的方法。我不能从 List 转换到 List(我认为我可以)。那么,我该怎么做才能使我的代码正常工作?这里有一个例子:

List<MyClass> lista = returnMyClassList();
myMethod((List<Interface>) lista); //this doesn't work

//myMethod signature
public void myMethod(List<Interface> struttura);

感谢您的帮助。

4

5 回答 5

9

使用类型的上限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
}
于 2013-09-17T13:47:38.197 回答
2

List<MyClass>不是List<Interface>您遇到错误的子类型。
符合 java文档

给定两个具体类型 A 和 B(例如 Number 和 Integer),MyClass 与 MyClass 没有关系,无论 A 和 B 是否相关。MyClass 和 MyClass 的共同父对象是 Object

所以将您的方法签名更改为

   public void myMethod(List<? extends Interface> struttura){
   }

并调用方法

   List<MyClass> lista = returnMyClassList();      
   myMethod((lista);
于 2013-09-17T13:41:08.460 回答
2

你应该使用public void myMethod(List<? extends Interface> struttura);. 这样,您将能够传递IS-A Interface. 您想阅读有关多态性和泛型的信息

于 2013-09-17T13:41:33.690 回答
1

您可以使用:

public void myMethod(List<? extends Interface> struttura);

为了得到两者List<Interface>List<MyClass>

于 2013-09-17T13:40:43.810 回答
1

你不能施放这个,因为你会做出一个你无法坚持的承诺。

当您转换 from 时List<MyClass>List<Interface>您将获取一个包含多个 MyClass 类型的对象的列表,并将其扩展为一种类型,该类型(其中包括)以下承诺:

  1. Interface get(int index) - 你可以得到一个接口的元素(没问题)
  2. boolean add(Interface e)- 您可以添加任何接口类型的元素(如果它是 MyClass 的子类型)(这是一个问题!)

第二点是有问题的,因为底层的 List 仍然是一个 list ofMyClass而不是Interface一般的 list of。您仍然可以在单独的变量中保存指向基础列表的链接,并可以get在该列表上运行。如果你添加了一个类型为 的对象Interface,那也不是 a MyClass,你可以MyClassList<MyClass>.

正如所有其他答案和评论所指出的那样,正确的解决方案是 type List<? extends Interface>。使用这种类型,您仍然可以Interface从列表中获取类型的对象(作为方法调用的返回值),但不能将任何内容放入列表中(用作方法调用的参数)。

于 2013-09-17T14:27:46.053 回答