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");
我需要怎么做才能解决此问题并解决编译器错误?
答案 0 :(得分: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>
}