当前位置:  开发笔记 > 编程语言 > 正文

关于Java子类继承返回"this"的方法

如何解决《关于Java子类继承返回"this"的方法》经验,为你挑选了1个好方法。

Car一个公共方法的类

public Car myself() {
  return this;
}

有一个子类Ferrari,以及一个foo包含Ferrari对象的变量.

最后,

Ferrari bar = foo.myself();

这会警告你,因为该方法myself()返回一个Car对象,而不是预期的对象Ferrari.

注意:我知道这个例子很愚蠢,因为你只是这么做bar = foo.这只是一个例子.


解决方案:

覆盖myself()方法Ferrari.

在分配时将Car对象强制转换为Ferrari对象bar.


两种解决方案都有效,我对此感到满意.但是,当你有几个子类时,第一个是不可取的Car.我觉得一遍又一遍地覆盖一种方法会破坏继承它的意义.接下来,关于第二种解决方案,铸造并不漂亮.感觉很愚蠢 - 如果我的变量是类型的Ferrari,那么Java是否应该能够在没有警告我的情况下隐式地转换它?毕竟,Java必须知道返回的对象可以被转换为Ferrari,不是吗?


还有另一种解决方法吗?只是出于好奇 - 我可以忍受铸造的东西,告诉Java应该是什么东西......



1> Erwin Bolwid..:

此解决方案以Java库中更常用的方式使用泛型.

它可以工作,您不必每次都转换结果,也不必覆盖myself每个子类中的方法.

我相信这是唯一不需要覆盖或转换的解决方案.它确实要求每个子类使用自己的类型作为超类的类型参数Car:class Ferrari extends Car

class Car> {
    public X myself() {
        return (X) this;
    }
}

class Ferrari extends Car {
}

然后按预期使用它:

Ferrari testarossa = new Ferrari().myself();

这个概念在Java标准库中也以这种或那种方式使用了几次:

java.lang.Enum

public abstract class Enum>

java.util.Comparable

public interface Comparable

(你应该当你实现一个堪比通过自己的类类型:class ShoeSize implements Comparable)

方法链

对此也有很好的用处 - 有一种模式,有些人喜欢,允许方法链接.这是做什么的StringBuilder:new StringBuilder().append("a").append("b").toString().但是,支持方法链接的类通常很难进行子类化.使用上面概述的方法可以在这种情况下进行子类化.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有