我有通用接口(interface)操作数:
public interface Operand<T extends Operand<T>> {
T add(Operand<T> op);
T sub(Operand<T> op);
T mul(Operand<T> op);
T div(Operand<T> op);
}
由2个类实现:
public class DoubleOperand implements Operand<DoubleOperand> {
...
}
public class RationalOperand implements Operand<RationalOperand> {
...
}
我编写了由 DoubleOperandFactory 和 RationalOperandFactory 类实现的“工厂”接口(interface):
public interface OperandFactory {
<T extends Operand<T>> Operand<T> valueOf(String s);
}
public class DoubleOperandFactory implements OperandFactory{
@Override
public Operand<DoubleOperand> valueOf(String s) { ... }
}
public class RationalOperandFactory implements OperandFactory {
@Override
public Operand<RationalOperand> valueOf(String s) { ... }
}
在我的程序中,我使用枚举来存储特定工厂的实例:
public enum OperandType {
DOUBLE(new DoubleOperandFactory()), RATIONAL(new RationalOperandFactory());
private OperandFactory fact;
OperandType(OperandFactory fact){ this.fact = fact; }
public OperandFactory getFact() { return fact; }
}
现在,由于未经检查的转换,我在两个工厂类上收到消息警告“未经检查的覆盖”,我对此感到非常困惑。我尝试的第一件事是(因为在类似主题中最常见的答案是这里)用通用工厂接口(interface)替换通用方法,但最终它变得不可能将它们与应该返回特定工厂的枚举一起使用,而不需要 >,因为我必须创建一个操作数列表(目前为通用类型 T extends Operand
最佳答案
public interface OperandFactory {
<T extends Operand<T>> Operand<T> valueOf(String s);
}
这个界面并不像你想象的那样。
此接口(interface)宣称它的实例可以生成您想要的任何类型的操作数。它不仅仅生成一种特定类型的操作数。它生成所有这些。
这不是您实际拥有的。
你需要的是
public interface OperandFactory<T extends Operand<T>> {
T valueOf(String s);
}
...然后放弃枚举,因为您不能拥有像这样具有不同类型的枚举。这不是你在 Java 中被允许做的事情。
关于java - 未经检查的覆盖(好吧,我似乎需要我的泛型方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47425318/