出于必要,我的代码相当复杂。我试图简化我正在处理的对象系统的总体布局,以(希望)使其更易于理解。

abstract class BaseType {}

abstract class MixinTypeA implements BaseType {}

abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
  Future<T> mixinMethod({bool argA = true,
      bool argB = true,
      bool argC = true}) =>
    someMethodCall()
}

abstract class BaseTypeA extends BaseType implements MixinTypeA {
  // declares a constructor
  BaseTypeA();
}

abstract class BaseTypeB extends BaseType implements MixinTypeB {
  // declares a constructor
  BaseTypeB();
}

abstract class TypeA extends BaseTypeA {}

class TypeB extends BaseTypeB with MixinTypeB<TypeA> {}

在这种情况下,TypeB将产生错误。这是因为它尝试混合MixinTypeB<TypeA>。因为TypeB已经用推断的BaseTypeB泛型扩展了实现MixinTypeB<MixinTypeA>,所以MixinTypeB接口(interface)用两个不同的(尽管与继承相关)接口(interface)实现了两次:TypeAMixinTypeA

本质上,存在T泛型以使我的代码保持DRY。 MixinTypeB中的方法示例是该类可能具有的特定类型签名T的各种潜在方法之一。我不知道如何绕开新的限制而不损害这种类型系统的继承结构。

最佳答案

一般而言,最常见的解决方案是将泛型穿过层次结构以使类型对齐。对于此特定示例,以下代码适用。

abstract class BaseType {}

abstract class MixinTypeA implements BaseType {}

abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
  Future<T> mixinMethod({bool argA = true,
      bool argB = true,
    bool argC = true}) => null;
}

abstract class BaseTypeA extends BaseType implements MixinTypeA {
  // declares a constructor
  BaseTypeA();
}

abstract class BaseTypeB<T extends MixinTypeA> extends BaseType implements MixinTypeB<T>{
  // declares a constructor
  BaseTypeB();
}

abstract class TypeA extends BaseTypeA {}

class TypeB extends BaseTypeB<TypeA> with MixinTypeB<TypeA> {}

如果您不需要将BaseTypeBMixinTypeB的任何其他实例混合在一起,那么以下更简单的方法也可以工作:
abstract class BaseType {}

abstract class MixinTypeA implements BaseType {}

abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
  Future<T> mixinMethod({bool argA = true,
      bool argB = true,
    bool argC = true}) => null;
}

abstract class BaseTypeA extends BaseType implements MixinTypeA {
  // declares a constructor
  BaseTypeA();
}

abstract class BaseTypeB extends BaseType implements MixinTypeB<TypeA>{
  // declares a constructor
  BaseTypeB();
}

abstract class TypeA extends BaseTypeA {}

class TypeB extends BaseTypeB with MixinTypeB<TypeA> {}

07-28 12:06