Java:名称相同但泛型类型不同

时间:2014-05-20 18:17:02

标签: java generics types

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

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

我知道发布的代码不起作用,但可以使其相似。

在你问之前,应该在这个List上执行多个动作,但是我不会再用一个不同的List名称再写一遍。

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());
    }
}

1 个答案:

答案 0 :(得分:5)

由于类型擦除,您要求的是完全没有意义。类型参数在运行时不再存在,因此从new ArrayList<Foo1>获得的内容与从new ArrayList<Foo2>获得的内容完全相同。

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

当然,如果您已声明

,您的代码将会编译
ArrayList<?> list;

List<?> list;

或者如果Foo1Foo2有一个共同的超类型(Object除外),你可以缩小它 - 说它们都是Foo的子类型,你可以写

List<? extends Foo> list;

但你为什么要打扰?