java返回子类_java – 从超类型方法返回子类类型

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本身类型相比,它没有任何意义或表现力.参数化版本的区别仅在于难以使用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值