java - 在保证类型与子类相同的情况下,如何在不进行强制转换的情况下访问父类(super class)字段?

标签 java generics nodes

我有以下代码。我可以在不使用泛型进行强制转换的情况下访问类 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,那么您根本不需要泛型类型。只需将 sourcedestination 更改为 DijkstraNode (如评论中提到的 @markspace)。

但是如果您想让它更加灵活并与任何 Node 实现一起使用,那么您需要将子类类型传递给父类(super class)。在下面的代码中,Edge类被参数化并接受任何扩展Node类型的类型(假设sourcedestination字段在给定的 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/

相关文章:

java - 发送 url 时发送回 xml 响应

java - 组合和泛型

C# 和泛型 : how can I handle processing based on type?

java - 反转链表的问题

java - 使用 Hibernate 从 Postgres 枚举到 Java

javaFX jar 应用程序

java - 无法将 String 转换为双向链表节点

javascript - Promise Bluebird 的问题

java - 两个 SharedPreferences 不工作-java

c# - 调用泛型方法并在运行时设置泛型类型