在Java中怎么创建一个范型类型的实例?

比如说下面这段代码,想要在Demo内部直接实例化一个E类型的对象。

class Demo<T> {
    T createItem() {
        return ??
    }
}
java范型
1
187
已修改
小课
小课2022-06-01 17:00
1 个回答

以前我会通过获取范型的真实类型,然后通过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);
1
已修改
小课
小课2022-06-01 17:18
你的回答

内容