Java-使用泛型返回多种类型

Mar*_*yam 4 java generics methods return

我有这样的方法 -

public List<Apples> returnFruits(String arg1){
List<Apples> fruits = new ArrayList<Apples>();
Apple a = new Apple();
fruits.add(a);

return fruits;
}
Run Code Online (Sandbox Code Playgroud)

我想改变它,以便我可以从方法调用中指定水果类型并返回该水果列表.所以第二个语句应该动态实例化我传递的水果列表.我想到了这个 -

public List<?> returnFruits(String arg1){
List<T> fruits = new ArrayList<T>();
T t = new T();
fruits.add(t);

return fruits;
}
Run Code Online (Sandbox Code Playgroud)

但是你可以看到,不知道正确的方法.

在第二种方法中,我只是返回水果而不是列表 -

public T returnFruit(){
T t = new T();
return t;
}
Run Code Online (Sandbox Code Playgroud)

传递的果实不在同一个类层次结构中,并且是不同的类型.

谢谢.

Nic*_*ube 6

如果您确定您将拥有无参数构造函数,则可以使用以下语法:

public <T> List<T> returnFruits(Class<T> clazz){
    List<T> fruits = new ArrayList<T>();
    T t = clazz.newInstance();
    fruits.add(t);

    return fruits;
}
Run Code Online (Sandbox Code Playgroud)

用法:

List<MyClass> m = returnFruits(MyClass.class, "plop");
Run Code Online (Sandbox Code Playgroud)

如果您知道有一个带String参数的构造函数:

public <T> List<T> returnFruits(Class<T> clazz, String arg1){
    List<T> fruits = new ArrayList<T>();
    Constructor<T> constructor = clazz.getConstructor(String.class);
    T t = constructor.newInstance(arg1);
    fruits.add(t);

    return fruits;
}
Run Code Online (Sandbox Code Playgroud)

用法:

List<MyClass> m = returnFruits(MyClass.class, "plop");
Run Code Online (Sandbox Code Playgroud)

等等.