将List<MyClass>转换为List<Interface>

9
我觉得我在编写代码时犯了一些错误。 我有一个实现了接口的MyClass类,现在我有一个方法,这个方法是将Interface的List作为参数的通用方法。我想通过传递一个List来使用我的方法。我不能将List强制转换为List(我原以为可以)。那么,我该怎么做才能让我的代码运行起来呢?以下是一个例子:
List<MyClass> lista = returnMyClassList();
myMethod((List<Interface>) lista); //this doesn't work

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

感谢您的帮助。

4
将你的方法签名更改为 List<? extends Interface>。关于为什么会发生这种情况,请阅读此文 - Sotirios Delimanolis
谢谢,你的链接让我明白了这个问题。 - Pievis
5个回答

14

使用 <? extends Interface> 作为类型的上限:Interface

下面是使用 JDK 类来说明的可编译代码:

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

public static void main(String[] args) {
    List<Integer> lista = null;
    myMethod(lista); // compiles OK
}

2

您可以使用:

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

为了同时获取 List<Interface>List<MyClass>

2

List<MyClass>不是List<Interface>的子类型,您会收到错误信息。
根据Java 文档

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

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

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

并调用该方法

   List<MyClass> lista = returnMyClassList();      
   myMethod((lista);

2
你应该使用 public void myMethod(List<? extends Interface> struttura);。这样你就可以传递任何类型的 IS-A Interface。你可以阅读关于泛型和多态性的文章。

1
你无法进行此操作,因为这样做会让你承诺无法实现。
当你从 List<MyClass> 转换为 List<Interface> 时,你将一个包含多个 MyClass 类型对象的列表转换为一个类型,该类型作出以下承诺之一:
  1. Interface get(int index) - 你可以得到一个 Interface 类型的元素(没有问题)
  2. boolean add(Interface e) - 你可以添加任何类型为 Interface 的元素(无论它是 MyClass 的子类型还是不是)(这是一个问题!)
第二点是有问题的,因为底层的 List 仍然是 MyClass 类型的列表,而不是一般的 Interface 类型的列表。你仍然可以在一个单独的变量中保留对底层 List 的链接,并在该列表上运行 get。如果你添加了一个不是 MyClass 的 Interface 类型的对象,则可以从 List<MyClass> 中获取此非 MyClass 对象。
正如其他答案和评论所指出的那样,正确的解决方案是类型 List<? extends Interface>。使用这种类型,您仍然可以从列表中获取类型为 Interface 的对象(作为方法调用的返回值),但您不能将任何内容放入列表中(用作方法调用的参数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接