【发布时间】:2016-09-01 21:45:59
【问题描述】:
我必须为分层实体设计一个接口:
interface HierarchicalEntity<T extends HierarchicalEntity<T>> {
T getParent();
Stream<T> getAncestors();
}
在getParent() 方面实现默认 getAncestors() 方法非常容易,前者将返回所有祖先的Stream。
实现示例:
default Stream<T> getAncestors() {
Stream.Builder<T> parentsBuilder = Stream.builder();
T parent = getParent();
while (parent != null) {
parentsBuilder.add(parent);
parent = parent.getParent();
}
return parentsBuilder.build();
}
但我还需要将this 包含到流中,这里出现了问题。
以下行不正确,因为this 的类型为HierarchicalEntity,而不是T:
parentsBuilder.add(this); // type mismatch!
如何重新设计界面以使getAncestors() 包含this 到结果中?
【问题讨论】:
-
不幸的是,这永远不会是完全类型安全的。 Java 没有自引用类型语法。我可以创建一个
class Fake implements HierarchicalEntity<SomeOtherType>,而你的getAncestors最终可能会以ClassCastException失败。 -
明白了。也许可以对整个界面进行一些重新设计。
-
只需将
this转换为T并将其添加到流构建器中 -
@federico-peralta-schaffner 可能的选项,但上面 Sotirios Delimanolis 描述的案例存在问题。似乎没有类型安全的方法来解决这个问题。
-
@Aliaxander 是的,没办法。不过,如果层次结构使用正确,我认为可以安全地假设强制转换是有效的。
标签: java interface java-8 hierarchical default-method