线性继承结构无法工作根接口的b / c:可复制<c extends =“”copyable <c =“”>&gt; </c>

时间:2014-01-31 02:57:23

标签: java generics inheritance

(这是对this question的跟进,后者本身就是this question的后续行动。)

我有以下接口/类(下面的框架代码)

interface Copyable<C extends Copyable<C>>  {
   interface Validator<V extends Validator<V>> extends Copyable<V>  {
      interface ValidateValue<O> extends Validator<ValidateValue<O>>  {

abstract class AbstractValidator<V extends AbstractValidator<V>> implements Validator<V>  {
   class VVNull<O> extends AbstractValidator<VVNull<O>> implements ValidateValue<O>  {

在没有Copyable的情况下执行<C extends Copyable<C>>时过去常常工作,但是,正如之前的两个问题向我说明的那样,Copyable确实需要这些泛型。

不幸的是,现在我无法编译VVNull

C:\java_code\CopyableCProblem.java:23: error: Validator cannot be inherited with different arguments: <ValidateValue<O>> and <VVNull<O>>

这是以下源代码中的第23行:

class VVNull<O> extends AbstractValidator<VVNull<O>> implements ValidateValue<O>  {

VVNull<O> 一个ValidateValue<O>。它将自身作为goodness-sakes的泛型参数传递,并实现ValidateValue<O>。继承是完全线性的 - 没有“钻石”继承或任何东西,它是Copyable<--Validator<--ValidateValue<--VVNull

我意识到 - 或者实际上,我应该说我认为 - 自我泛型会起作用,也就是说,如果你使每个类都自我泛化,例如

VVNull<O,V extends VVNull<O,V>>

但我迫切希望找到另一种解决方案。当你开始需要自己的额外泛型的子类时,自引用泛型是完全混乱的。这就是为什么我只能通过Validator进行自我泛化,因为它是最不可能直接使用的候选者。经常直接使用ValidateValueVVNull。我真的很希望还有其他可能性。

可比较的工作正常而不需要在其所有实施类中使用自带泛型,那么我如何才能使这项工作适用于Copyable

感谢您的任何建议。

public class CopyableCProblem  {
}

interface Copyable<C extends Copyable<C>>  {
   C getObjectCopy();
}

interface Validator<V extends Validator<V>> extends Copyable<V>  {
}

interface ValidateValue<O> extends Validator<ValidateValue<O>>  {
   @Override
   ValidateValue<O> getObjectCopy();
   boolean isValid(O o_o);
}

abstract class AbstractValidator<V extends AbstractValidator<V>> implements Validator<V>  {
}

class VVNull<O> extends AbstractValidator<VVNull<O>> implements ValidateValue<O>  {
   @Override
   public VVNull<O> getObjectCopy()  {
      return  this;
   }
   public boolean isValid(O o_o)  {
      return  (o_o != null);
   }
}

0 个答案:

没有答案