我有一个看起来像这样的课程。
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
。似乎是什么问题,为什么我会收到类型安全警告?
答案 0 :(得分:4)
int x = array[10];
您在这里向呼叫者保证 。您是在告诉他们“无论我们使用的是model.find({
'level1.level_name': level,
'level1.step.field_name': subject,
'level1.step.sub_step.field_name1':'data1',
'level1.step.sub_step.field_name2':'data2'
}).project({'level1.step.sub_step.field_name3': true, _id: false})
的哪个子类,此方法都将返回可以安全地视为public <K extends ClassB> K someMethod(T t) {
return null;
}
的 any 子类的值” 。然后,您的子类SuperClass
就会出现,并通过创建仅返回ClassB
的版本来违反承诺,这直接违反了您已订立的合同。通用Main
/ ClassA
声明是对调用方的承诺,而不是扩展代码的人。