作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
abstract class AnimalSerializer<E extends Animal> {
/**
* The type E (which extends Animal) is important here.
* I want to be able to write data that is specific to a subclass of an animal.
*/
abstract void writeAnimal(E animal);
abstract Animal readAnimal();
}
abstract class Animal {
AnimalSerializer<? extends Animal> serializer;
Animal(AnimalSerializer<? extends Animal> speciesSerializer) {
serializer = speciesSerializer;
}
void writeAnimalToFile() {
// This line fails to compile
serializer.writeAnimal(this);
}
}
class DogSerializer extends AnimalSerializer<Dog> {
@Override
void writeAnimal(Dog animal) {
// Write the stuff that is specific to the dog
// ...
}
@Override
Animal readAnimal() {
// Read the stuff specific to the dog, instantiate it, and cast it as an animal.
// ...
return null;
}
}
class Dog extends Animal {
String dogTag = "Data specific to dog.";
Dog() {
super(new DogSerializer());
}
}
我的问题与编译失败的行( serializer.writeAnimal(this)
)有关。我必须第一次调出语言规范才能了解有关 this
的更多信息。关键字,但我认为问题在于“this”关键字的类型为 Animal
,以及有界通配符泛型 <? extends Animal>
仅支持 Animal 子类的类型,而不支持 Animal
输入自己。
我认为编译器应该知道 this
的类型关键字必须是一个扩展 Animal 的对象,因为 Animal 无法实例化,并且 this
关键字仅适用于已经存在的对象。
编译器无法知道这一点是否有原因?我的猜测是有一个案例可以解释为什么this
不能保证关键字是 Animal 的子类。
此外,这种模式是否存在根本缺陷?
最佳答案
您的序列化器
泛型类型是?扩展动物
。你的this
类型是Animal
,它也可以被认为是?扩展动物
。但这两个?
是不同的类型。没有任何限制让编译器知道它们是相同的类型。
例如,我写了一个Cat
类
class Cat extends Animal {
Cat(){
super(new DogSerializer()); // this is ok for your generic
}
}
这就是编译器给你一个错误的原因。
关于java - 抽象类和泛型中 "this"关键字的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51606834/
我是一名优秀的程序员,十分优秀!