Java 8通配符类型无法直接实例化

问题描述 投票:1回答:1

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);
    }
}

但是,我在<?>用法的return语句中遇到编译器错误:

通配符类型'?'无法直接实例化

所以再次,我希望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个回答
3
投票

无论你在实现中做什么,这个签名都不允许你进行这些调用,因为Memory<?>Memory<Fizz/Buzz/AnythingElse>的超类型。如果你有public Object createMemory(...),你不会期望将其结果分配给Memory<Fizz>,对吗?这没什么不同。

要允许这些调用,您必须使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>
}
© www.soinside.com 2019 - 2024. All rights reserved.