gpt4 book ai didi

一般递归自类型值的 Java 字段类型?

转载 作者:搜寻专家 更新时间:2023-11-01 02:56:22 25 4
gpt4 key购买 nike

给定一个类层次结构,其中基类定义了一个递归的自身类型:

abstract class A<T extends A<T>> { }

我如何声明另一个类(它在 T 中不应该是泛型的,因为这样的 T 在对象的生命周期内可能会发生变化),其字段可以包含 A 的任何子类?

以下不起作用:

public class B {
//fails to compile, because the capture of ? is not sufficiently narrow
private A<?> a;

public <T extends A<T>> setA(T a) {
this.a = a;
}
}

-- 问题结束--

我注意到许多 StackOverflow 成员倾向于用“您首先为什么要这样做?”来解决某些难题。以下是我使用此模式的理由 - 您可以注意到 Java 标准库在其 Enum 类的定义中也使用递归自类型:Enum<E extends Enum<E>> .这个问题可以类似地问为“如何定义 Enum<?> 类型的字段。

理由示例:

abstract class A<T extends A<T>> {
public abtract T self();
public B<T> bify(Bifyer bifyer) {
return bifyer.bify(self());
}
}

带有子类:

class ASub1 extends A<ASub1> { 
public ASub1 self() { return this; }
}

class ASub2 extends A<ASub2> {
public ASub2 self() { return this; }
}

绑定(bind)到并行类层次结构:

abstract class B<T extends A<T>> {
}

class BSub1<T extends A<T>> implements B<T> { }
class BSub2<T extends A<T>> implements B<T> { }
//and others

并且生成由 Bifyer 接口(interface)的实现管理的 B 实例:

interface Bifyer {
B<ASub1> bify(ASub1 asub1);
B<ASub2> bify(ASub2 asub2);
}

此接口(interface)的实现可能会为 B 返回 BSub1 或 BSub2。这本质上是访问者模式的应用,其中 Bifyer 是访问者,但与标准访问者不同,accept 方法返回一个值而不是 void。这提供了一个模块化框架,其中可以指定不同的 Bifyer 实现来为 Bify 方法提供替代行为和返回类型 - 比如 B 的每个子类。

最佳答案

如果你用 A 绑定(bind)下面的通配符 ?,它应该可以工作:

public class B {
private A<? extends A> a;

public <T extends A<T>> void setA(T a) {
this.a = a;
}
}

关于一般递归自类型值的 Java 字段类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/695298/

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