【发布时间】:2016-06-10 11:32:00
【问题描述】:
我用这样的通用返回类型调用一个方法:
public static <T extends HotelBean> List<T> fill(Class<T> c) throws InstantiationException, IllegalAccessException {
List<T> list = new ArrayList<>();
for (int i = 0; i <= 2; i++) {
T t = c.newInstance();
list.add(t);
}
return list;
}
有没有办法在这个方法中创建一个实例而不给出Class 作为方法参数? (Class<T> c)
【问题讨论】:
-
由于类型擦除,可能不在这样的方法中。编译器也无法推断
T的实际类型。摆脱参数的唯一方法是在某些反射数据中定义T的类型,即具有具体类型的字段定义或类。但是,这可能会与您的方法的目的相矛盾,或者至少不会比传递参数更容易。 -
不,泛型类型已被删除 (docs.oracle.com/javase/tutorial/java/generics/erasure.html),因此 Java 可以在运行时使用以确定它应该创建的实例类型的唯一内容来自
Class。 -
您也可以通过
Supplier<T>来代替,使用MyType::new方法引用作为参数。这至少会摆脱 throws 子句 -
@JornVernee 你能提供一个使用
Supplier<T>的例子吗?我对您的解决方案非常感兴趣。 -
@Patrick 我会回答的