【问题标题】:Java 8 wildcard type cannot be instantiated directlyJava 8 通配符类型不能直接实例化
【发布时间】:2019-03-19 21:05:37
【问题描述】:

这里是 Java 8。我有以下通用类:

public class Memory<T> {
    private String moniker;
    private Date timestamp;
    private T data;

    // constructors, getters & setters, etc.
}

我正在尝试像这样构建一个非泛型 MemoryFactory

public class MemoryFactory {
    public Memory<?> createMemory(Object data, String moniker) {
        Date now = new Date();

        return new Memory<?>(moniker, now, data);
    }
}

但是,对于 &lt;?&gt; 用法,我在返回语句中遇到编译器错误:

通配符类型 '?'不能直接实例化

同样,我希望MemoryFactory 是非泛型的,并允许我进行以下调用:

Memory<Fizz> fizzMemory = memoryFactory.createMemory(new Fizz(), "fizz1");
Memory<String> strMemory = memoryFactory.createMemory("SOMETHING", "str1");
Memory<Buzz> buzzMemory = memoryFactory.createMemory(new Buzz(11, true), "buzz1");

我需要做什么来完成此操作并修复编译器错误?

【问题讨论】:

    标签: generics java-8 compiler-errors


    【解决方案1】:

    无论如何,无论您在实现中做什么,此签名都不允许您进行这些调用,因为Memory&lt;?&gt;Memory&lt;Fizz/Buzz/AnythingElse&gt;超类型。如果您有public Object createMemory(...),您不会期望将其结果分配给Memory&lt;Fizz&gt;,对吗?这也不例外。

    要允许这些调用,您必须createMemory(不是MemoryFactory)设为通用:

    public <T> Memory<T> createMemory(T data, String moniker) {
        Date now = new Date();
    
        return new Memory<>(moniker, now, data); // or new Memory<T>
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多