Flutter:类型 "A" 不是类型 "B" 的 sup 类型,即使 B 扩展了 A
Flutter: Type "A" is not a sup type of type "B" even though B extends A
试图将 class NumberTrivia
的实例分配给 class NumberTriviaModel
的实例,但它给我错误:
The argument type 'NumberTrivia' can't be assigned to the parameter type 'NumberTriviaModel'.
。所以我试着投射它,但现在我得到了一个未捕获的错误。 Reso 代码之前可以将 NumberTrivia 分配给 NumberTriviaModel。但它是一个较旧的飞镖版本,现在不能以同样的方式完成。现在的主要问题是如何在较新的 dart 版本中这样做。
void main() {
NumberTrivia remoteTrivia = NumberTrivia(text : "Text", number : 5);
cacheNumberTrivia(remoteTrivia as NumberTriviaModel);
}
class NumberTrivia {
final String text;
final int number;
NumberTrivia({
required this.text,
required this.number,
});
}
class NumberTriviaModel extends NumberTrivia {
NumberTriviaModel({
required String text,
required int number,
}) : super(text: text, number: number);
factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
return NumberTriviaModel(
text: json['text'],
number: (json['number'] as num).toInt(),
);
}
Map<String, dynamic> toJson() {
return {
'text': text,
'number': number,
};
}
}
void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
print(triviaToCache.number);
}
但它给我以下错误
Uncaught Error: TypeError: Instance of 'NumberTrivia': type 'NumberTrivia' is not a subtype of type 'NumberTriviaModel'
向下转换 是不安全的:extending-object 在向下转换时可能有额外的因此缺少的属性。这就是它导致错误的原因。
作为一种替代方法,可以使用一种特殊的构造函数来克隆/复制 object:
void main() {
NumberTrivia remoteTrivia = NumberTrivia(text: "Text", number: 5);
cacheNumberTrivia(NumberTriviaModel.copy(remoteTrivia));
}
class NumberTrivia {
final String text;
final int number;
NumberTrivia({
required this.text,
required this.number,
});
}
class NumberTriviaModel extends NumberTrivia {
NumberTriviaModel.copy(NumberTrivia nt) // HERE
: this(text: nt.text, number: nt.number);
NumberTriviaModel({
required String text,
required int number,
}) : super(text: text, number: number);
factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
return NumberTriviaModel(
text: json['text'],
number: (json['number'] as num).toInt(),
);
}
Map<String, dynamic> toJson() {
return {
'text': text,
'number': number,
};
}
}
void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
print(triviaToCache.number);
}
编辑前
Instance of 'NumberTrivia':
type 'NumberTrivia' is not a subtype of type 'NumberTriviaModel'
这意味着 NumberTrivia
不会扩展 NumberTriviaModel
。
看代码,正好相反。 NumberTriviaModel
扩展了 NumberTrivia
,NumberTriviaModel
是一个 sub-type NumberTrivia
:
class NumberTriviaModel extends NumberTrivia {
! SUBTYPE ! TYPE
您的标题是 Type "A" is not a sup type of type "B" even though A extends B
。但是代码并没有反映出这一点。
相反,代码可以描述为Type "A" is not a sup type of type "B" BECAUSE B extends A
。
你调用方法的方式是错误的。这里A扩展了B。如果你想访问A的方法,你需要使用A的实例。如果你在B中添加了方法并试图通过A的实例访问,你可以使用它。
void main() {
NumberTriviaModel remoteTrivia = NumberTriviaModel(text : "Text", number : 5);
cacheNumberTrivia(remoteTrivia as NumberTriviaModel);
}
class NumberTrivia {
final String text;
final int number;
NumberTrivia({
required this.text,
required this.number,
});
}
class NumberTriviaModel extends NumberTrivia {
NumberTriviaModel({
required String text,
required int number,
}) : super(text: text, number: number);
factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
return NumberTriviaModel(
text: json['text'],
number: (json['number'] as num).toInt(),
);
}
Map<String, dynamic> toJson() {
return {
'text': text,
'number': number,
};
}
}
void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
print(triviaToCache.number);
}
试图将 class NumberTrivia
的实例分配给 class NumberTriviaModel
的实例,但它给我错误:
The argument type 'NumberTrivia' can't be assigned to the parameter type 'NumberTriviaModel'.
。所以我试着投射它,但现在我得到了一个未捕获的错误。 Reso 代码之前可以将 NumberTrivia 分配给 NumberTriviaModel。但它是一个较旧的飞镖版本,现在不能以同样的方式完成。现在的主要问题是如何在较新的 dart 版本中这样做。
void main() {
NumberTrivia remoteTrivia = NumberTrivia(text : "Text", number : 5);
cacheNumberTrivia(remoteTrivia as NumberTriviaModel);
}
class NumberTrivia {
final String text;
final int number;
NumberTrivia({
required this.text,
required this.number,
});
}
class NumberTriviaModel extends NumberTrivia {
NumberTriviaModel({
required String text,
required int number,
}) : super(text: text, number: number);
factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
return NumberTriviaModel(
text: json['text'],
number: (json['number'] as num).toInt(),
);
}
Map<String, dynamic> toJson() {
return {
'text': text,
'number': number,
};
}
}
void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
print(triviaToCache.number);
}
但它给我以下错误
Uncaught Error: TypeError: Instance of 'NumberTrivia': type 'NumberTrivia' is not a subtype of type 'NumberTriviaModel'
向下转换 是不安全的:extending-object 在向下转换时可能有额外的因此缺少的属性。这就是它导致错误的原因。
作为一种替代方法,可以使用一种特殊的构造函数来克隆/复制 object:
void main() {
NumberTrivia remoteTrivia = NumberTrivia(text: "Text", number: 5);
cacheNumberTrivia(NumberTriviaModel.copy(remoteTrivia));
}
class NumberTrivia {
final String text;
final int number;
NumberTrivia({
required this.text,
required this.number,
});
}
class NumberTriviaModel extends NumberTrivia {
NumberTriviaModel.copy(NumberTrivia nt) // HERE
: this(text: nt.text, number: nt.number);
NumberTriviaModel({
required String text,
required int number,
}) : super(text: text, number: number);
factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
return NumberTriviaModel(
text: json['text'],
number: (json['number'] as num).toInt(),
);
}
Map<String, dynamic> toJson() {
return {
'text': text,
'number': number,
};
}
}
void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
print(triviaToCache.number);
}
编辑前
Instance of 'NumberTrivia':
type 'NumberTrivia' is not a subtype of type 'NumberTriviaModel'
这意味着 NumberTrivia
不会扩展 NumberTriviaModel
。
看代码,正好相反。 NumberTriviaModel
扩展了 NumberTrivia
,NumberTriviaModel
是一个 sub-type NumberTrivia
:
class NumberTriviaModel extends NumberTrivia {
! SUBTYPE ! TYPE
您的标题是 Type "A" is not a sup type of type "B" even though A extends B
。但是代码并没有反映出这一点。
相反,代码可以描述为Type "A" is not a sup type of type "B" BECAUSE B extends A
。
你调用方法的方式是错误的。这里A扩展了B。如果你想访问A的方法,你需要使用A的实例。如果你在B中添加了方法并试图通过A的实例访问,你可以使用它。
void main() {
NumberTriviaModel remoteTrivia = NumberTriviaModel(text : "Text", number : 5);
cacheNumberTrivia(remoteTrivia as NumberTriviaModel);
}
class NumberTrivia {
final String text;
final int number;
NumberTrivia({
required this.text,
required this.number,
});
}
class NumberTriviaModel extends NumberTrivia {
NumberTriviaModel({
required String text,
required int number,
}) : super(text: text, number: number);
factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
return NumberTriviaModel(
text: json['text'],
number: (json['number'] as num).toInt(),
);
}
Map<String, dynamic> toJson() {
return {
'text': text,
'number': number,
};
}
}
void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
print(triviaToCache.number);
}