如何在java列表中使用继承?
我想继承一个DAG类,它包含一个节点的ArrayList。为了继承ArrayList,我使用了如何在java列表中使用继承?,java,inheritance,Java,Inheritance,我想继承一个DAG类,它包含一个节点的ArrayList。为了继承ArrayList,我使用了ArrayList您的ArrayList属于泛型类型,它继承自Node,而不是Node,但是您向它添加了一个节点,该节点可能是错误的类型-这会导致编译错误,因为此操作可能不安全。(见答案末尾的解释) 处理它的一种方法是将ArrayList声明为ArrayList,而不是ArrayList,您需要了解在您的示例中我会做什么: public class DAG { ArrayList<Nod
ArrayList您的ArrayList
属于泛型类型,它继承自Node
,而不是Node
,但是您向它添加了一个节点,该节点可能是错误的类型-这会导致编译错误,因为此操作可能不安全。(见答案末尾的解释)
处理它的一种方法是将ArrayList
声明为ArrayList
,而不是ArrayList,您需要了解在您的示例中我会做什么:
public class DAG {
ArrayList<Node> nodes;
Node root;
public DAG(Node root) {
// ..
}
}
公共类DAG{
阵列列表节点;
节根;
公共DAG(节点根){
// ..
}
}
这样,节点
可以包含类型为节点
的对象,并且继承自节点
的任何类型都不包括快照,只需粘贴代码和格式(4-空格缩进)。(1)放入实际代码,而不是“快照”。(2) 但我仍然无法编译我的代码
为什么?如果您使用通配符作为列表的泛型类型
,则无法添加到它,因为编译器无法知道您添加的内容是否与通配符匹配。所以不要使用通配符。我使用了通用ArrayList,因为ArrayList和ArrayList不相等,在我之前提出的一个问题中,有人建议使用通用ArrayList,但它仍然存在问题。没有使用ArrayList和ArrayList@amirveyseh然后,您可能希望使该类成为泛型类。请参见编辑。“您的ArrayList是从节点继承的泛型类型,而不是从节点继承,但您向其添加了一个节点,”。。。我甚至无法理解这意味着什么。在这么多层面上,这似乎很奇怪。
public class DAG <T extends Node> {
ArrayList<T> nodes;
T root;
public DAG(T root) {
/...
}
}
public static class A {
}
public static class B extends A {
}
public static class C extends A {
}
public static <T extends A> void foo(ArrayList<T> arr, A a) {
arr.add(a); //this fails at compilation
}
public static void main(String[] args) throws Exception {
ArrayList<B> arr = new ArrayList<>();
foo(arr, new C());
B b = arr.get(0);
}
class A {
}
class B extends A {
}
class C extends A {
}
List<T extends A> nodes = new ArrayList<>();
B b = new B();
C c = new C();
nodes.add(b);
nodes.add(c);
public class DAG {
ArrayList<Node> nodes;
Node root;
public DAG(Node root) {
// ..
}
}