您可能想将界面更改为:
public interface OperandValue<T>
{
T getValue();
}
并实施:
public class NumberOperandValue implements OperandValue<Integer>
{
@Override
public Integer getValue()
{
// some integer value that is set elsewhere
return 1;
}
}
现在您要告诉接口您希望该方法返回什么类型。换句话说,您正在使接口类型变得通用,而不是方法声明。但这似乎就是你想要的。
作为旁注:
public <Integer> Integer getValue()
实际上意味着“定义一个名为“Integer”的泛型类型参数”,其中getValue
返回“Integer”类型you刚刚定义。
回应史蒂夫下面的评论:
当我删除<Integer>
从我的方法实现中,我然后
收到一条警告:Type safety: The return type Integer for
getValue() from the type NumberOperandValue needs unchecked conversion
to conform to T from the type OperandValue
该警告消息表明您在使用 Java 泛型时违反了规则。要了解原因,让我们在删除方法签名之前考虑一下方法签名的含义<Integer>
类型参数。
public <Integer> Integer getValue()
这个签名意味着该方法getValue
返回类型的值Integer
where Integer
被定义为您在尖括号之间定义的泛型类型参数。字符串的含义Integer
是完全任意的,并且具有与以下完全相同的含义:
public <T> T getValue()
为了清楚起见,为了解决您的问题,我们继续使用此版本的方法签名。当我们删除类型参数时会发生什么?
public T getValue()
现在如果你尝试编译,你会得到一个错误T
未定义。但是,因为您的原始类型签名使用名称声明了类型参数Integer
,当你删除它时,你剩下:
public Integer getValue()
Because Integer
is already预定义类型,方法签名在技术上仍然是合法的。然而,类型参数的名称恰好与已存在的类型相同只是偶然。
此外,因为您的接口已经声明了方法签名with泛型,当您从实现中删除它时,Java 编译器会生成警告。具体来说,编译器担心在基类中,方法的返回类型是(类型擦除为Object
) 通用参数命名Integer
,它与名为的系统类不是同一类型(也不知道与其类型兼容)Integer
(or java.lang.Integer
准确地说)。