【发布时间】:2018-12-28 22:26:29
【问题描述】:
我正在尝试制作一个容器(父)对象,您可以在其中指定它可以包含的对象(子)的类型。
同样,您可以指定孩子的父母类型。 父母和孩子以后需要交流,所以我需要他们都有相互的对象引用。
此代码是我的应用中实际代码的更简单表示。
class Parent<T extends Child> {
ArrayList<T> childObjects;
public void addChildChild(T newChild) {
childObjects.add(newChild);
newChild.setParent(this);
}
public void newChildConnected(T connectedChild) {
System.out.println("Child connected");
}
}
class Child <T extends Parent> {
T parentObject;
public void setParent(T newParent) {
parentObject = newParent;
parentObject.newChildConnected(this);
}
}
我的 IDE 说: 未经检查地调用“newChildConnected(T)”作为原始类型“test.Parent”的成员
我一直在尝试不同的方法来更好地使用通配符和其他东西,但这是我能做的最好的事情。 那么实现这种行为的正确方法是什么?
我的目标是能够为父级指定子类型,为子级指定父级类型,并以子级和父级都能够在不使用 intanceof() 运算符和强制转换的情况下使用彼此的功能的方式执行此操作。 (这就是我使用泛型的原因)
在 Java 中甚至可能吗?
【问题讨论】:
-
我不认为这是可能的,不。请参阅 Joshua Bloch 的 Effective Java 中的“Typesafe Heterogenous Containers”以获得更好的方法。
-
我的第一种方法忽略原始类型警告是否有任何危险?
-
当然,这不是类型安全的。您可以/应该阻止原始类型,例如通过编写
T extends Child<?>和T extends Parent<?>>,只是为了将警告变成错误,表明此时的类型根本不兼容。可能有一些解决方法,但鉴于虚拟代码,很难说这里最合适的是什么...... -
@JerryLundegaard 它允许
new ChildA<ParentB>().setParent(new ParentB())和class ParentB extends Parent<ChildB>之类的东西。因此,您最终会得到一个只期望 ChildB 拥有 ChildA 的父母。