flutter - 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);
}
}
解决方案
AVeganItemDomainEntity extends ADomainEntity<AVeganItemDomainEntity, int>
GroceryItemDomainEntity extends AVeganItemDomainEntity
所以GroceryItemDomainEntity
延伸ADomainEntity<AVeganItemDomainEntity, int>
。
在GroceryItemRepository extends ARepository<GroceryItemDomainEntity, int>
,EntityType
是GroceryItemDomainEntity
。
然而
ARepository<EntityType extends ADomainEntity<EntityType, IdType>, IdType>
既然EntityType
是GroceryItemDomainEntity
,ARepository
期望GroceryItemDomainEntity
扩展ADomainEntity<GroceryItemDomainEntity, int>
,但它反而扩展ADomainEntity<AVeganItemDomainEntity, int>
。
AVeganItemDomainEntity
是 的超类GroceryItemDomainEntity
。因此,AVeganItemDomainEntity
不能在GroceryItemDomainEntity
预期的地方使用。但另一种方法是可能的。
这需要更改EntityType
扩展的内容ARepository
。我能想到的一个可能的解决方案是使用具体的基本类型,如AEntity
or ADomainEntity
。
ARepository<EntityType extends ADomainEntity<AEntity, IdType>, IdType>
ARepository<EntityType extends ADomainEntity<ADomainEntity, IdType>, IdType>
要不就
ARepository<EntityType extends ADomainEntity, IdType>
推荐阅读
- c++ - CLion MakeFile 构建失败
- docker-for-windows - 在 Docker-compose 中使用现有的文件共享/卷和 Docker for Windows WSL2
- r - 更改 .Rprofile 中的图形显示选项
- vb.net - 双列表成员之间的减法
- paypal - 贝宝订阅 API 集成。我什么时候需要创建产品?
- c++ - 接受任何大小的 char 的 std::array 作为非类型模板参数
- python-3.x - 获取顶点和连接到它的顶点的详细信息
- list - 创建我自己的模块和类型没有按预期工作
- python - python字典异步安全吗?
- devops - Microsoft Azure Devops 2019 停止保留构建后不移除构建锁