[英]Create generic instance inside a method
我用这样的通用返回类型调用方法:
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
)
不,不幸的是,没有。 这是必须首先通过Class<T>
主要原因。
Java编译器在称为类型擦除的过程中从已编译的类和方法中剥离通用信息。 到编译器完成时,所有T
成为Object
或下限类型(这在您的示例中对应于HotelBean
)。 如果没有对Class<T>
的访问权限,该方法将无法还原类型参数,而这是产生新实例所必需的。
请注意,您的示例将必须以一种或另一种方式传递所需的类型,因为您正在用可能是HotelBean
的子类的对象填充基类对象的列表。
不必传递Class
来创建实例,这意味着必须处理捕获或引发异常,而可以传递Supplier<T>
。
java.util.function.Supplier<T>
(Java 8的一个功能)是一个具有一个方法get
的功能接口,该方法返回类型T
的对象。
使用Supplier<T>
看起来像这样:
public static <T extends HotelBean> List<T> fill(Supplier<T> supp) { // No more exceptions!
List<T> list = new ArrayList<>();
for (int i = 0; i <= 2; i++) {
T t = supp.get();
list.add(t);
}
return list;
}
您可以传递不带参数的方法引用,并返回类型T
的对象作为提供者,其中包括默认的T
构造函数。
class MyClass {
public MyClass() {...}
}
fill(MyClass::new);
与newInstance()
的主要区别在于,从Supplier<T>
返回的对象不一定是新对象,因为不必传递MyClass::new
。 您可以传递任何不带参数并返回T
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.