有一个Person类,以及Person类的扩展,如下所示:
class Person {
bool get isEmpty{
return this == null;
}
}
extension PersonExt on Person {
bool get isEmptyByExt {
return this == null;
}
}
通话内容如下:
Person person;
var result = person.isEmptyByExt;
print(result);
var result2 = person.isEmpty; // ERROR
print(result2);
person.isEmptyByExt;
通话没有问题;
但是person.isEmpty;
将在此处报告错误:
NoSuchMethodError: The getter 'isEmpty' was called on null.
Receiver: null
Tried calling: isEmpty
为什么?为什么?
1条答案
按热度按时间c0vxltue1#
调用示例方法涉及虚拟分派,并且需要一个实际的对象示例进行继承,方法重写在运行时才能工作。在示例方法中,
this
永远不会是null
。扩展方法是静态函数的语法糖,使它们看起来像示例方法。即:
本质上等同于:
它们处理对象的静态(编译时已知)类型,而不是对象的实际运行时类型。(这就是为什么扩展方法不能在
dynamic
类型上工作,并且它们不能被派生类重写。)由于它们等价于static
函数,因此对象可以是null
。请注意,启用null-safety后,这一点会更清楚一些,其中存在以下区别:
extension PersonExt on Person
(this
不能是null
)extension PersonExt on Person?
(this
* 可以 * 是null
)。进一步阅读:Dart Extension Methods Fundamentals