Java 当可以确保类型与子类相同时,如何在不强制转换的情况下访问超级类字段?
我有以下代码。我是否可以访问类Java 当可以确保类型与子类相同时,如何在不强制转换的情况下访问超级类字段?,java,generics,nodes,Java,Generics,Nodes,我有以下代码。我是否可以访问类djikstraode的方法doSomething中的number属性,而不使用泛型强制转换?我可以确保列表edges仅包含类型为DjikstraNode的项 public class Node { protected List<Edge> edges = new ArrayList<>(); } public class Edge { public Node source; public Node destinati
djikstraode
的方法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);
}
}
公共类节点{
受保护的列表边=新的ArrayList();
}
公共阶级边缘{
公共节点源;
公共节点目的地;
}
公共类djikstraode扩展节点{
公共整数;
公共无效剂量测定法(){
System.out.println(((djiktranode)edges.get(0.source).number);
}
}
如果Edge
类始终只包含dijkstraode
,那么您根本不需要泛型类型。只需将source
和destination
更改为DijkstraNode
(如注释中提到的@markspace)
但是,如果您想使它更灵活,并使用任何节点
实现,那么您需要将子类类型传递给超类。在下面的代码中,Edge
类被参数化,并接受扩展节点
类型的任何类型(假设给定节点
对象中的源
和目标
字段始终具有相同的类型)
公共类节点{
受保护的列表边=新的ArrayList();
}
公共阶级边缘{
公共信源;
公共旅游目的地;
}
公共类Djikstraode在这里扩展代码中的节点{//typo:Dijkstra
公共整数;
公共无效剂量测定法(){
System.out.println(edges.get(0.source.number));
}
}
否。如果您想这样做,您应该将边声明为列表
@ganti-nit:他的名字拼写为Dijkstra。