2014-05-20 20 views
2

我想为我的代码使用ArrayList,但它应该包含不同类型的对象。 所以它应该是某事像这样:Java:同名,但不同的通用类型

switch (foo) { 
     case "foo1": 
      list=new ArrayList<foo1>(); 
      break; 
     case "foo2": 
      list = new ArrayList<foo2>(); 
      break; 

我知道贴的代码不工作但有可能使某物相似。

而你问之前应该有多个行动在这个名单上执行,但我不会再写一切,只是用一个不同的名称名单。

public class foo1 {} 

public class foo2 {} 

    import java.util.ArrayList; 
public class work{ 
    public static void main(String[] args){ 
    ArrayList<?> list; 
    switch (args[0]) { 
      case "foo1": 
       list=new ArrayList<foo1>(); 
       break; 
      case "foo2": 
       list= new ArrayList<foo2>(); 
       break; 
      default: 
       System.out.println("Some Error Text"); 
       return; 

     } 
    list.add(new foo1()); 
    } 
} 
+0

调查通配符。 –

+0

这是可能的,但可能不是很有用。它看起来像[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你能描述一下你想如何使用对这些列表的引用吗? – Pshemo

+0

发布的代码将在Java 7中工作 – nikis

回答

5

你问什么是完全是毫无意义的,因为类型擦除。类型参数在运行时不再存在,因此您从new ArrayList<Foo1>获得的内容与从new ArrayList<Foo2>获得的内容完全相同。

换句话说,类型参数只是编译器的信息。在您使用的代码中,编译器确实只关心list的声明类型,而不是您在实例化时提供的类型。

当然,你的代码进行编译,如果你已经声明

ArrayList<?> list; 

List<?> list; 

,或者你可以缩小范围,如果Foo1Foo2有一个共同的超类型(比Object等) - 说他们都是Foo的亚型,你可以写

List<? extends Foo> list; 

但你为什么要打扰?

+0

谢谢你的工作,但现在我不能使用ArrayList中的方法。 我得到一个“不兼容的类型:ArrayList 无法转换为ArrayList ...”。我每次都必须将它转换为正确的类型吗? – user3657850

+0

你能给出一个给你这个错误的代码行的例子吗? –

+0

所以我创建了一个带有通配符的List,并在switch case中用不同的泛型类型初始化它,但是当我想使用类似 fooList.add(foo1)的东西; 它给我错误。 – user3657850

相关问题