繁体   English   中英

多级Java通用继承使用扩展通用参数

[英]Multilevel Java generic inheritance using extends on generic parameters

我有

public class First<T> {}

public class Second<T extends SomeConcreteClass> extends First<T> {}

public class Third<T> extends Second<T> {} //Compile-time error

我得到编译时错误

Type argument T is not with bounds of type-variable T.

当我构造一个Third ,我希望能够将泛型参数作为SomeConcreteClass (或其派生类)给出,并且如果我提供了一个不属于SomeConcreteClass的类型,则抛出运行时错误继承层次结构。

我认为Second声明中的规范只会向下传播,即它应该隐含在Third的声明(以及任何实例化)中。

有什么错误?

所有你需要的是

public class Third<T extends SomeConcreteClass> extends Second<T>

你只需要重新指定绑定。 它不像你想象的那样传播。

(我不是肯定的原因,但我有一些猜测 - 如果它是Third<T> extends Second<Foo<T>>怎么办?对T的适当限制是不明显的,如果有甚至是相反,它只是不会自动传播;你必须指定它。)

你有一个向下传播的边界限制。

如果您将上面的代码放在通用术语中,您将清楚地看到受限制的声明。 此外,任何进一步的继承还需要保持或进一步缩小该限制。 例如:

public class First<T> {}

public class Second<U, T1 extends U> extends First<T1> {}

public class Third<V, T2 extends V> extends Second<V,T2> {} 

请注意,现在很清楚,你不能拥有

public class Third<T> extends Second<T> {} 

因为您缺少Second<V,T2>所需的T2类型信息。 当您使用具体类时,此限制将变为隐式。

在我们的例子中,您可以替换它:

public class Third<T> extends Second<T> {}

有了这个:

public class Third extends Second<SomeConcreteClass> {}

要在构造函数中使用T,否则在代码中使用T类型的成员字段,那么您可以这样做:

VB2 extends VB1<Frag2>
...
public VB2(Frag2 frag){...

VB1<T extends Frag1> extends CommonVB<T>
...
public V1(T frag){... /// notice the T

CommonV<T extends CommonFragBase> extends BaseVB<T>
...
public CommonVB(T controller) {...

BaseVB<T extends CommonFragBase>

这样可行。 重要的是具体类的泛型必须指定实际的具体片段类,以便VB类中的其他代码访问其方法。

public class Third<T> extends Second<T> {}

这是一个约束不匹配。 当您刚刚指定第二个类型为T而不是扩展SomeConcreteClass时,您不能使用泛型T扩展Second。 扩展Second时,需要使用SomeConcreteClass范围内的内容。

public class Third<T> extends Second<ClassThatExtendsSomeConcreteClass> {}

要不就

public class Third<T> extends Second<SomeConcreteClass> {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM