1

符号:Inter是接口;Abs[N]是一个抽象类。

以下代码在 Java 中运行良好,没有问题:

public class Impl<T extends Abs1<T>> extends Abs2<T> {...}

但是,如果您想通过 上的接口引入另一个绑定T,我还没有找到任何简单的方法来做到这一点,即:

public class Impl<T extends Inter & Abs1<T>> extends Abs2<T> {...}

不起作用,因为Abs1作为抽象类不能用作边界参数。我发现的最简单但丑陋(丑陋吗?)的解决方案是:

public class Impl<B extends Inter, T extends Abs1<B>> extends Abs2<T> {...}

我有一种预感,在具有特征的 Scala 中存在一个更优雅的解决方案,但是对于 Java 有什么提示吗?

4

1 回答 1

0

哦,我的……嗯,这很尴尬。我非常专注于 F-Bound,以至于我忘记了它直接来自JLS,第 4.4 节

每个声明为类型参数的类型变量都有一个界限。如果没有为类型变量声明边界,则假定为 Object。如果声明了边界,则它包括:

  • 单个类型变量T,或

  • 一个类或接口类型T,可能后跟接口类型I1 & ... & In

换句话说,(抽象)类声明必须首先出现在交集类型中。所描述的行为与 F-Boundedness 无关。即,以下工作:

public class Impl<T extends Abs1<T> & Inter> extends Abs2<T> {...}

Java 教程中也对此进行了描述。仔细想想,它是不言自明的,因此解析器有一种简单的方法来检查双重继承(这是被禁止的)。

于 2017-02-17T07:43:28.703 回答