比如说下面这段代码,想要在Demo内部直接实例化一个E类型的对象。
class Demo<T> {
T createItem() {
return ??
}
}
以前我会通过获取范型的真实类型,然后通过Class<?>.newInstance()
方法来实例一个对象,但是这本身也是有风险的,因为范型类型本身就是作为类型参数让调用者传入的,它可能有很多构造方法,那我们该通过那个构造方法来实例化呢?如果直接使用默认的构造方法是否符合调用者的需求呢?
所以我觉得更好的实现是提供一个类似工厂方法的接口,让调用者自己完成范型类型的实例化,这里为了简便就使用Java中已经定义好的Supplier接口作为工厂接口。
1class Demo<T> {
2 private final Supplier<T> factory;
3
4 public Demo(Supplier<T> factory) {
5 this.factory = factory;
6 }
7
8 T createItem() {
9 return factory.get();
10 }
11}
这样在调用时就需要调用者把创建范型类型的接口实现,具体代码如下
Demo<Shape> demo = new Demo<>(new Supplier<Shape>() {
@Override
public Shape get() {
return new Rectangle();
}
});
Shape shape = demo.createItem();
如果和上面一样仅仅是创建无参数的Rectangle对象,可以更简单一点实现。
Demo<Shape> demo = new Demo<>(Rectangle::new);
内容