我有以下代码。我可以在不使用泛型进行强制转换的情况下访问类 DjikstraNode
的方法 doSomething
中的 number
属性吗?我可以确保列表 edges
仅包含类型为 DjikstraNode
的项目。
public class Node {
protected List<Edge> edges = new ArrayList<>();
}
public class Edge {
public Node source;
public Node destination;
}
public class DjikstraNode extends Node {
public int number;
public void doSomething() {
System.out.println(((DjikstraNode)edges.get(0).source).number);
}
}
最佳答案
如果 Edge
类始终只包含 DijkstraNode
,那么您根本不需要泛型类型。只需将 source
和 destination
更改为 DijkstraNode
(如评论中提到的 @markspace)。
但是如果您想让它更加灵活并与任何 Node
实现一起使用,那么您需要将子类类型传递给父类(super class)。在下面的代码中,Edge
类被参数化并接受任何扩展Node
类型的类型(假设source
和destination
字段在给定的 Node
对象始终具有相同的类型)。
public class Node<T extends Node> {
protected List<Edge<T>> edges = new ArrayList<>();
}
public class Edge<T extends Node> {
public T source;
public T destination;
}
public class DjikstraNode extends Node<DjikstraNode> { // typo in your code here: Dijkstra
public int number;
public void doSomething() {
System.out.println(edges.get(0).source.number);
}
}
关于java - 在保证类型与子类相同的情况下,如何在不进行强制转换的情况下访问父类(super class)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58806293/