我对java泛型有一个非常具体的问题。已经预定义了以下类和接口:
public interface IFirst<R, T> {...}
public abstract class AbstractFirst<T extends AbstractFirst, L extends IFirst<String, T>> {...}
public interface ISecond extends IFirst<String, AbstractSecond> {...}
public abstract class AbstractSecond extends AbstractFirst<AbstractSecond, ISecond> {...}
现在我已经创建了一个似乎有效的以下repo定义:
public abstract class AbstractRepo<T extends AbstractFirst<T, IFirst<String,T>>> {...}
但现在我想扩展它:
public class RepoFirst extends AbstractRepo<AbstractSecond> {...}
我收到以下错误:
Bound mismatch: The type AbstractSecond is not a valid substitute for the bounded parameter
<T extends AbstractFirst<T,IFirst<String,T>>> of the type AbstractRepo<T>
我不能改变前四个(至少不是根本上),因为它们与应用程序的其余部分根深蒂固,但后两个是新的,如果需要的话可以进行更改。
同样有趣的是它允许以下(带有原始类型警告):
public class RepoFirst extends AbstractRepo {
...
@Override
AbstractFirst someAbstractMethod() {
return new AbstractSecond() {...};
}
...
}
但是为了代码清晰,我想通过明确定义AbstractSecond作为Abstract Repo的泛型类型来实现它。
我错过了什么?
答案 0 :(得分:3)
您的AbstractRepo
需要IFirst
的实例,而不是IFirst
的子类型。但是,AbstractSecond
显然不是IFirst
。 (我的意思是,从OO的角度来看,但对于泛型,List<Number>
与List<Integer>
不同。这是第三个问题。如果您可以像AbstractRepo
那样将IFirst
从? extends IFirst
更改为AbstractFirst
,则可能会有效。