首页 > 解决方案 > dart 类层次结构错误 - 'a' 没有扩展 'b' 尝试使用是或是 'b' 的子类的类型

问题描述

我有这个代码:

class GroceryItemRepository extends ARepository<GroceryItemDomainEntity, int> {
  GroceryItemRepository(IHttpDataSource httpDataSource)
      : super(httpDataSource, 'GroceryItems');
}

导致此编译时错误:

'GroceryItemDomainEntity' doesn't extend 'ADomainEntity<GroceryItemDomainEntity, int>'.
Try using a type that is or is a subclass of 'ADomainEntity<GroceryItemDomainEntity, int>'

我不知道为什么GroceryItemDomainEntity不延长ADomainEntity<GroceryItemDomainEntity, int>

这是类层次结构:

abstract class GroceryItemDomainEntity extends AVeganItemDomainEntity
    implements _$GroceryItemDomainEntity {

abstract class AVeganItemDomainEntity
    extends ADomainEntity<AVeganItemDomainEntity, int> {

abstract class ADomainEntity<EntityType, IdType> extends AEntity<EntityType>
    implements IDomainEntity<EntityType, IdType> {

abstract class AEntity<EntityType> implements IEntity<EntityType> {

当我声明GroceryItemDomainEntity为:

abstract class GroceryItemDomainEntity extends ADomainEntity<GroceryItemDomainEntity, int>

但我需要GroceryItemDomainEntity包含AVeganItemDomainEntity. 为什么GroceryItemDomain实体不扩展ADomainEntity<GroceryItemDomainEntity, int>

编辑 - 对不起,我错过了这门课:

import 'package:vepo/src/common/constants/environment_constants.dart';
import 'package:vepo/src/data/data_sources/remote/i_remote_data_source.dart';
import 'package:vepo/src/domain/common/domain_entity/a_domain_entity.dart';

import 'i_repository.dart';

abstract class ARepository<EntityType extends ADomainEntity<EntityType, IdType>,
    IdType> implements IRepository<EntityType> {
  ARepository(this.httpDataSource, this.$baseUri);

  final IHttpDataSource httpDataSource;
  final String $baseUri;

  @override
  Future<EntityType> $fetch() {
    throw UnimplementedError();
  }

  @override
  Future<EntityType> $save({EntityType entity}) {
    var uri = $baseUri;
    if (entity.id != null) {
      uri = uri + '${entity.id}';
    }
    final Uri theUri = Uri(path: '${EnvironmentConstants.of().apiUrl}/$uri');
    return httpDataSource.post<EntityType>(theUri, body: entity);
  }
}

标签: flutterdart

解决方案


AVeganItemDomainEntity extends ADomainEntity<AVeganItemDomainEntity, int>
GroceryItemDomainEntity extends AVeganItemDomainEntity

所以GroceryItemDomainEntity延伸ADomainEntity<AVeganItemDomainEntity, int>

GroceryItemRepository extends ARepository<GroceryItemDomainEntity, int>EntityTypeGroceryItemDomainEntity

然而

ARepository<EntityType extends ADomainEntity<EntityType, IdType>, IdType>

既然EntityTypeGroceryItemDomainEntityARepository期望GroceryItemDomainEntity扩展ADomainEntity<GroceryItemDomainEntity, int>,但它反而扩展ADomainEntity<AVeganItemDomainEntity, int>

AVeganItemDomainEntity是 的超类GroceryItemDomainEntity。因此,AVeganItemDomainEntity不能在GroceryItemDomainEntity预期的地方使用。但另一种方法是可能的。

这需要更改EntityType扩展的内容ARepository。我能想到的一个可能的解决方案是使用具体的基本类型,如AEntityor ADomainEntity

ARepository<EntityType extends ADomainEntity<AEntity, IdType>, IdType>
ARepository<EntityType extends ADomainEntity<ADomainEntity, IdType>, IdType>

要不就

ARepository<EntityType extends ADomainEntity, IdType>

推荐阅读