我对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> {...}
现在,我创建了以下似乎正确的回购定义:
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的泛型类型来实现它。
我想念什么?
最佳答案
您的AbstractRepo
需要一个IFirst
实例,而不是IFirst
的子类型。但是您的AbstractSecond
显然不是IFirst
。 (从OO的角度来看,我的意思是,但对于泛型,List<Number>
与List<Integer>
不同)。是第二。如果您可以像对AbstractRepo
那样将IFirst
从? extends IFirst
更改为AbstractFirst
,则可能会起作用。