public abstract class BaseClass> {
T method1(){
return getThis();
}
public abstract T getThis();
}
public class SubClass extends BaseClass {
public SubClass getThis(){
return this;
}
}
如果它只是一个继承级别,我可以执行类似上面的操作,并在调用method1()时获取SubClass的引用.
如果我有两个级别的继承怎么办?
public abstract class SubClass1> extends BaseClass> {
@Override
public SubClass1 getThis() {
return this;
}
}
public class SubSubClass1 extends SubClass1 {
}
我应该更改为method1和BaseClass,以便在调用method1时我可以返回SubSubClass1类型.没有任何压制警告,我不想这样做
最佳答案 重要的是要理解每个类型参数化类的类型参数都是它自己的.特别是,它们(参数本身)不与超类或子类共享.类型参数化子类通常有意与其超类共享类型参数值,但这是另一回事.
类可以指定它们的超类,但它们不会改变它们的超类自己的继承.因此,如果SubClass1扩展了BaseClass< SubClass1< T>>然后BaseClass的类SubClass1< T>的类型参数并且其每个子类都是SubClass1< T>,因为该类仅是SubClass1< T>的类.延伸.
BaseClass< T>的任何具体子类.必须实现其抽象方法getThis(),并且需要这样的类(例如SubClass1)将BaseClass的类型参数T指定为可实例化的类型(否则它不能提供返回值).从层次结构开始,子类可以使用协变返回类型来缩小getThis()返回的类型,但是它们不能更改SubClass1指定的BaseClass类型参数,除非它依赖于SubClass1自己的类型参数(s) ).例如,这完全编译:
public abstract class BaseClass> {
// ...
public abstract T getThis();
}
public abstract class SubClass1> extends BaseClass> {
@Override
public SubClass1 getThis() {
return this;
}
}
public class SubSubClass1 extends SubClass1 {
@Override
public SubSubClass1 getThis() {
return this;
}
}
但这是一个协变返回类型的练习,而不是类型参数化,所以这也有效:
public abstract class BaseClass {
// ...
public abstract BaseClass getThis();
}
public abstract class SubClass1 extends BaseClass {
@Override
public SubClass1 getThis() {
return this;
}
}
public class SubSubClass1 extends SubClass1 {
@Override
public SubSubClass1 getThis() {
return this;
}
}
@HannoBinder的道具,他们首先在评论中提出了协变返回类型.
请注意,如果这里的主要想法是使用一个类型参数来标记你实际拥有的BaseClass的后代 – 或者至少是它的上限 – 那么这就是错误的.在该方法中,类型为BaseClass< SomeSubClass>与SomeSubClass本身类型相比,它没有任何意义或表现力.参数化版本的区别仅在于难以使用.