交织在一起的java通用接口和类

时间:2014-05-02 10:28:59

标签: java generics

我对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的泛型类型来实现它。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

您的AbstractRepo需要IFirst的实例,而不是IFirst的子类型。但是,AbstractSecond显然不是IFirst。 (我的意思是,从OO的角度来看,但对于泛型,List<Number>List<Integer>不同。这是第三个问题。如果您可以像AbstractRepo那样将IFirst? extends IFirst更改为AbstractFirst,则可能会有效。