gpt4 book ai didi

java - 方法链+继承不能很好地结合在一起?

转载 作者:太空宇宙 更新时间:2023-11-04 13:15:54 25 4
gpt4 key购买 nike

This question has been asked in a C++ context但我对Java很好奇。关于虚拟方法的担忧并不适用(我认为),但如果您遇到这种情况:

abstract class Pet
{
private String name;
public Pet setName(String name) { this.name = name; return this; }
}

class Cat extends Pet
{
public Cat catchMice() {
System.out.println("I caught a mouse!");
return this;
}
}

class Dog extends Pet
{
public Dog catchFrisbee() {
System.out.println("I caught a frisbee!");
return this;
}
}

class Bird extends Pet
{
public Bird layEgg() {
...
return this;
}
}


{
Cat c = new Cat();
c.setName("Morris").catchMice(); // error! setName returns Pet, not Cat
Dog d = new Dog();
d.setName("Snoopy").catchFrisbee(); // error! setName returns Pet, not Dog
Bird b = new Bird();
b.setName("Tweety").layEgg(); // error! setName returns Pet, not Bird
}

在这种类层次结构中,是否有任何方法可以以不(有效)向上转换对象类型的方式返回 this

最佳答案

如果您想避免编译器发出未经检查的强制转换警告(并且不想 @SuppressWarnings("unchecked")),那么您需要做更多的事情:

首先,您对 Pet 的定义必须是自引用的,因为 Pet 始终是泛型类型:

abstract class Pet <T extends Pet<T>>

其次,setName 中的 (T) this 转换也未被选中。为了避免这种情况,请使用优秀的Generics FAQ by Angelika Langer中的“getThis”技术。 :

The "getThis" trick provides a way to recover the exact type of the this reference.

这会产生下面的代码,该代码编译并运行时不会出现警告。如果您想扩展您的子类,那么该技术仍然适用(尽管您可能需要泛化您的中间类)。

生成的代码是:

public class TestClass {

static abstract class Pet <T extends Pet<T>> {
private String name;

protected abstract T getThis();

public T setName(String name) {
this.name = name;
return getThis(); }
}

static class Cat extends Pet<Cat> {
@Override protected Cat getThis() { return this; }

public Cat catchMice() {
System.out.println("I caught a mouse!");
return getThis();
}
}

static class Dog extends Pet<Dog> {
@Override protected Dog getThis() { return this; }

public Dog catchFrisbee() {
System.out.println("I caught a frisbee!");
return getThis();
}
}

public static void main(String[] args) {
Cat c = new Cat();
c.setName("Morris").catchMice();
Dog d = new Dog();
d.setName("Snoopy").catchFrisbee();
}
}

关于java - 方法链+继承不能很好地结合在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524577/

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