我想创建一个抽象集合类(称为 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/