Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当可以确保类型与子类相同时,如何在不强制转换的情况下访问超级类字段?_Java_Generics_Nodes - Fatal编程技术网

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。