在 Java 中创建通用类型的实例?

2022-08-31 04:12:04

是否可以在 Java 中创建泛型类型的实例?我根据我所看到的情况思考答案是(由于类型擦除),但如果有人能看到我错过的东西,我会很感兴趣:no

class SomeContainer<E>
{
    E createContents()
    {
        return what???
    }
}

编辑:事实证明,超级类型令牌可以用来解决我的问题,但它需要很多基于反射的代码,正如下面的一些答案所指出的那样。

我会把这个开放一会儿,看看是否有人想出了与伊恩·罗伯逊(Ian Robertson)的Artima文章截然不同的东西。


答案 1

你是对的。你不能做.但您可以将其更改为new E()

private static class SomeContainer<E> {
    E createContents(Class<E> clazz) {
        return clazz.newInstance();
    }
}

这是一种痛苦。但它有效。将其包装在工厂模式中会使其更易于容忍。


答案 2

在 Java 8 中,您可以使用 Supplier 功能接口轻松实现这一点:

class SomeContainer<E> {
  private Supplier<E> supplier;

  SomeContainer(Supplier<E> supplier) {
    this.supplier = supplier;
  }

  E createContents() {
    return supplier.get();
  }
}

您可以像这样构造此类:

SomeContainer<String> stringContainer = new SomeContainer<>(String::new);

该行上的语法是构造函数引用String::new

如果您的构造函数采用参数,则可以改用 lambda 表达式:

SomeContainer<BigInteger> bigIntegerContainer
    = new SomeContainer<>(() -> new BigInteger(1));

推荐