从List <myclass>转换为List <interface> </interface> </myclass>

时间:2013-09-17 13:38:59

标签: java object interface casting

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

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

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

感谢您的帮助。

5 个答案:

答案 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类型对象的列表,并将其扩展为一个类型,使(以及其他)以下承诺:

  1. Interface get(int index) - 你可以获得thpe接口的元素(没问题)
  2. boolean add(Interface e) - 您可以添加Interface类型的任何元素(如果它是MyClass的子类型)(这是一个问题!)
  3. 第二点是有问题的,因为基础列表仍然是MyClass的列表,而不是一般的Interface列表。您仍然可以在单独的变量中保存指向基础List的链接,并且可以在该列表上运行get。如果您添加了Interface类型的对象,但不是MyClass,则可以从MyClass获取此非List<MyClass>

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