我有一个看起来像这样的类。
class SuperClass<T> {
public <K extends ClassB> K someMethod(T t) {
return null;
}
}
class ClassB {
}
class ClassA extends ClassB {
}
class ClassC {
}
public class Main extends SuperClass<ClassC>{
@Override
public ClassA someMethod(ClassC c) { //type safety warning in ClassA
return null;
}
}
根据我的理解,someMethod()
的返回类型可以是任何扩展 ClassB
或 ClassB
本身的类。显然 ClassA
是 ClassB
。似乎是什么问题,为什么我会收到类型安全警告?
最佳答案
public <K extends ClassB> K someMethod(T t) {
return null;
}
您在这里向来电者保证。您是在告诉他们“无论我们使用的是 SuperClass
的哪个子类,此方法都会返回一个值,该值可以安全地视为 的任何子类B 类
”。然后你的子类 Main
出现并打破了这个 promise ,制作了一个只返回 ClassA
的版本,这直接违反了你所订立的契约(Contract)。通用 extends
/super
声明是对调用者的 promise ,而不是对扩展代码的人的 promise 。
关于java - 使用泛型时遇到类型安全警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53164567/