当可以确保类型与子类相同时,如何在不强制转换的情况下访问超类字段?

我有以下代码。我可以在不使用泛型进行强制转换的情况下访问类export default class AppBar extends React.Component{ render(){ return <div style={divStyle}> <div style={{display:"flex"}}> <img alt="logo" style={imgStyle} src="adidasLogo.jpg"/> <div style={barButtonsDivStyle}> <BarButton onClick={() => store.dispatch(selectCategory("Men"))} value="Men"/> <Separator/> <BarButton onClick={() => store.dispatch(selectCategory("Women"))} value="Women"/> <Separator/> <BarButton onClick={() => store.dispatch(selectCategory("Kids"))} value="Kids"/> </div> </div> <div style={selectDivStyle}> <CurrencySelect options={["USD","EUR","MDL"]} /> </div> </div> } } 的方法number中的doSomething属性吗?我可以确保列表DjikstraNode仅包含类型为edges的项目。

DjikstraNode
weiqingtao 回答:当可以确保类型与子类相同时,如何在不强制转换的情况下访问超类字段?

如果Edge类始终仅包含DijkstraNode,则根本不需要泛型。只需将sourcedestination更改为DijkstraNode(如注释中提到的@markspace)即可。

但是,如果您想使其更加灵活并可以与任何Node实现一起使用,则需要将子类类型传递给超类。在下面的代码中,对Edge类进行了参数化,并接受任何扩展Node类型的类型(假设给定source对象中的destinationNode字段始终具有相同的类型)。

    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);
        }
    }
本文链接:https://www.f2er.com/3122294.html

大家都在问