java - 未经检查的覆盖(好吧,我似乎需要我的泛型方法)

标签 java generics

我有通用接口(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> {
    ...
}

我编写了由 DoubleOperandFactoryRationalOperandFactory 类实现的“工厂”接口(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/

相关文章:

java - JAXB:如何生成英文 Javadoc

java - 在 JFrame 上每个方法完成后写一个字符串

java - Android 应用程序中使用的服务器 Web 的 Google Places API KEY 请求被拒绝

java - 转换 JSON 结构

java - 具有返回 String 的静态方法的有界类型

c# - Unity3D 事件管理器 : Dictionary with Events of generic Type that derives from an interface

java - 如何在提交时使用 JTA 确认 JMS 消息?

c# - 如果 T 在泛型中为空怎么办?如何省略尖括号

c# - 通用接口(interface)、实现和依赖注入(inject) - 实现类型无法转换为服务类型

ios - 从通用返回类型获取实际类型