创建自引用类型时,这是一个反复出现的问题。在基本类型(或接口)中,您不能强制
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)