例如,我有一个 Processor 基类,其方法返回一个 Object 并以 Object 作为参数。我想扩展它并创建一个 StringProcessor 它将返回 String 并接受 String 作为参数。然而
协变类型仅允许与返回值一起使用,但不允许与参数一起使用。造成这种限制的原因是什么?
class Processor {
Object process (Object input) {
//create a copy of input, modify it and return it
return copy;
}
}
class StringProcessor extends Processor {
@Override
String process (String input) { // permitted for parameter. why?
//create a copy of input string, modify it and return it
return copy;
}
}
里氏原理。在设计 Processor 类时,您编写了一个约定:“Processor 能够接受任何对象作为参数,并返回一个对象”。
StringProcessor 是一个处理器。所以它应该遵守该合同。但如果它只接受 String 作为参数,则违反了该约定。请记住:处理器应该接受任何对象作为参数。
所以你应该能够做到:
StringProcessor sp = new StringProcessor();
Processor p = sp; // OK since a StringProcessor is a Processor
p.process(new Integer(3456));
当返回一个字符串时,它并没有违反约定:它应该返回一个对象,字符串就是一个对象,所以一切都很好。
您可以通过使用泛型来实现您想要实现的目标:
class Processor<T> {
Object process (T input) {
//create a copy of input, modify it and return it
return copy;
}
}
class StringProcessor extends Processor<String> {
@Override
String process (String input) {
return copy;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)