[英]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.