Java 泛型和类,决定构造函数中的子类

Java 泛型和类,决定构造函数中的子类,java,generics,Java,Generics,我希望能够让(我的一个)构造函数决定它想要使用的列表的实现。我编写的代码编译得很好,没有警告,但是IDE(eclipse)在注释行中抱怨,为什么以及如何推断类型 public class GenericClassTest<T> { private List<T> list; //stuff... public GenericClassTest(Class<? extends List> listCreator) throws Instan

我希望能够让(我的一个)构造函数决定它想要使用的列表的实现。我编写的代码编译得很好,没有警告,但是IDE(eclipse)在注释行中抱怨,为什么以及如何推断类型

public class GenericClassTest<T> {

private List<T> list;

//stuff...

public GenericClassTest(Class<? extends List> listCreator)
        throws InstantiationException, IllegalAccessException {
    this.list = listCreator.newInstance(); // how to infer type T? where
                                            // does diamondoperator go?
}

public static void main(String[] args) throws InstantiationException,
        IllegalAccessException {
    GenericClassTest<Integer> one = new GenericClassTest<>(ArrayList.class);
    GenericClassTest<String> two = new GenericClassTest<>(LinkedList.class);
    one.list.add(13);
    two.list.add("Hello");
    System.out.println(one.list);
    System.out.println(two.list);
}


}
公共类GenericClassTest{
私人名单;
//东西。。。

公共泛型类测试(类您实际上不需要。请记住,
类型擦除
无论如何都会在运行时将
t
替换为
对象
。因此,在运行时,您将始终拥有一个
列表
。因此,
t
是否是构造调用的一部分并不重要,因为它无论如何都会被忽略。泛型是一个compi时间方便,它们在运行时不会做很多事情。

你真的不需要。记住,
类型擦除
将在运行时用
对象
替换
t
。因此,在运行时,你总是会有一个
列表
。因此,
t
是否是ca构造的一部分并不重要ll,因为它无论如何都会被忽略。泛型是编译时的一种便利,它们在运行时不会做很多事情。

如果您想在代码中包含泛型,请尝试以下方法:

class Sample {
    static <T,L extends List<T>> L newList(Class<L> clazz) 
        throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }

    static <T> void mainCode() throws InstantiationException, IllegalAccessException {
        List<T> list;
        list = Sample.<String, ArrayList<String>>newList(ArrayList.class);      
    }
类示例{
静态L新列表(类clazz)
抛出实例化异常,IllegalAccessException{
返回clazz.newInstance();
}
静态void mainCode()抛出实例化异常,IllegalAccessException{
名单;
list=Sample.newList(ArrayList.class);
}

如果您想在代码中包含泛型,请尝试以下操作:

class Sample {
    static <T,L extends List<T>> L newList(Class<L> clazz) 
        throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }

    static <T> void mainCode() throws InstantiationException, IllegalAccessException {
        List<T> list;
        list = Sample.<String, ArrayList<String>>newList(ArrayList.class);      
    }
类示例{
静态L新列表(类clazz)
抛出实例化异常,IllegalAccessException{
返回clazz.newInstance();
}
静态void mainCode()抛出实例化异常,IllegalAccessException{
名单;
list=Sample.newList(ArrayList.class);
}

Class@BuhakeSindi编译错误警告消失,但如何推断参数ArrayList.class中的类型?我将添加
@SuppressWarnings({“rawtypes”,“unchecked”})
在构造函数之前使Eclipse保持静默。使Eclipse保持静默的最佳方法是使用intellij…如果执行
Class@BuhakeSindi编译错误警告消失,但如何推断参数ArrayList.class中的类型?我将添加
@SuppressWarnings({“rawtypes”,“unchecked”})
在构造函数之前使Eclipse保持静默。使Eclipse保持静默的最佳方法是使用intellij。。。