gpt4 book ai didi

java - Java 中的通用类(类型安全)相互依赖

转载 作者:行者123 更新时间:2023-11-29 06:26:06 25 4
gpt4 key购买 nike

我想创建一个抽象集合类(称为 Space)和一个抽象元素类(称为 Atom)。两者的实例必须相互了解(完全类型化)。这就是问题所在。

abstract class Space<A extends Atom>{
// ...
}

abstract class Atom<S extends Space>{
// ...
}

不好:

“A extends Atom”表示任何 Atom,但不是强类型的

“S extends Space”表示任何空间,但不是强类型空间

我也无法通过以下尝试达到完全类型安全:

abstract class Space<A extends Atom<? extends Space>>
abstract class Atom<S extends Space<? extends Atom>>

abstract class Space<S, A extends Atom<S extends Space<A>>>
abstract class Atom<A, S extends Space<A extends Atom<S>>>

and so on ...

记住,这两个类是抽象的,我希望任何可能的两个子类根据彼此分类。这意味着,以下示例中的类 SomeSpace 和 SomeAtom必须对彼此有很强的“类型知识”:

class SomeSpace extends Space<SomeAtom>
class SomeAtom extends Atom<SomeSpace>

最佳答案

这对我有用,尽管我对所有这些通用约束感到非常困惑。这意味着我不能保证它会做它应该做的事情:

interface ISpace<S extends ISpace<S, A>, A extends IAtom<S, A>> {
List<? extends IAtom<S, A>> getList(); //// CHANGED
}

interface IAtom<S extends ISpace<S, A>, A extends IAtom<S, A>> {
S getSpace();
}

abstract class Space<S extends Space<S, A>, A extends Atom<S, A>>
implements ISpace<S, A> {

private final List<Atom<S, A>> atoms = new LinkedList<Atom<S, A>>(); ////CHANGED

public Space() {
}
public Space<S, A> getSpace() {
return this;
}
@Override
public List<Atom<S, A>> getList() { //// CHANGED
return atoms;
}
}

abstract class Atom<S extends Space<S, A>, A extends Atom<S, A>>
implements IAtom<S, A> {

private final S space;

public Atom(S someSpace) {
this.space = someSpace;
space.getList().add(this);
}

@Override
public S getSpace() {
return space;
}

public Atom<S, A> getAtom() {
return this;
}
}

class Space1 extends Space<Space1, Atom1> {
public Space1() {
}
}

class Atom1 extends Atom<Space1, Atom1> {
public Atom1(Space1 someSpace) {
super(someSpace);
}
}

关于java - Java 中的通用类(类型安全)相互依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685408/

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