我对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,则可能会起作用。

09-26 23:22