gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:08:33 26 4
gpt4 key购买 nike

有一个带有公共(public)方法的Car

public Car myself() {
return this;
}

有一个子类 Ferrari 和一个包含 Ferrari 对象的变量 foo

最后,

Ferrari bar = foo.myself();

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

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


解决方案:

  • 重写 Ferrari 中的 myself() 方法。
  • 在分配 bar 时,将 Car 对象转换为 Ferrari 对象。

这两种解决方案都有效,我对此表示满意。但是,当您有 Car 的多个子类时,第一个是不受欢迎的。我觉得一遍又一遍地覆盖一个方法会破坏继承它的意义。接下来,关于第二种解决方案,类型转换并不漂亮。这感觉很傻——如果我的变量是 Ferrari 类型,Java 难道不应该能够在不警告我的情况下隐式转换它吗?毕竟,Java 必须知道返回的对象可以 转换为 Ferrari,不是吗?


还有其他解决方法吗?只是出于好奇——我可以接受强制转换,告诉 Java 应该是什么……

最佳答案

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

它有效,您不必每次都转换结果,也不必覆盖 myself每个子类中的方法。

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

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

class Ferrari extends Car<Ferrari> {
}

然后按照你的意图使用它:

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

这个概念在 Java 标准库中也以这样或那样的方式多次使用:

java.lang.Enum

public abstract class Enum<E extends Enum<E>>

java.util.Comparable

public interface Comparable<T>

(当你实现一个可比较的类时,你应该传递你自己的类类型:class ShoeSize implements Comparable<ShoeSize>)

方法链

这也有一个很好的用途 - 有一种模式允许方法链接,有些人喜欢这种模式。这就是StringBuilder做:new StringBuilder().append("a").append("b").toString() .然而,支持方法链的类通常很难继承。使用我上面概述的方法可以在这种情况下进行子类化。

关于java - 关于 Java 子类继承返回 "this"的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23041693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com