分层实体的设计界面

分层实体的设计界面,第1张

分层实体的设计界面

创建自引用类型时,这是一个反复出现的问题。在基本类型(或接口)中,您不能强制

this
将与分配兼容
T

当然,如果您确信所有子类型都将满足该约束

this
T
则可以执行to
的未经检查的强制转换。但是,无论何时需要
this
引用为,都必须执行此未经检查的强制转换
T

更好的解决方案是添加一个抽象方法,例如

public abstract T myself();

然后,您可以使用,

myself()
而不是
this
在需要自引用时使用
T

default Stream<T> getAncestors() {    Stream.Builder<T> parentsBuilder = Stream.builder();    for(T node = myself(); node != null; node = node.getParent()) {        parentsBuilder.add(parent);    }    return parentsBuilder.build();}

当然,您不能强制将子类正确实现

myself()
return this;
,但是至少,您可以轻松地验证它们是否在运行时执行:

assert this == myself();

该参考比较是一项非常便宜的 *** 作,如果

myself()
正确地实现为不变地返回
this
,HotSpot可以提前证明该比较将始终存在
true
并完全消除检查。

缺点是,每个专业化都必须具有的冗余实现

myself() { return this;}
,但是另一方面,它完全没有未经检查的类型转换。另一种选择是在基类中具有非
abstract
声明,以将未经检查的 *** 作限制为类型层次结构的单个位置。但是,您无法验证它是否真的是……
myself()``@SuppressWarnings("unchecked")T myself() { return (T)this; }``this``T



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5502022.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存