在Dart中这两种声明扩展方法的方式有什么区别吗?

gudnpqoy  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(123)

我发现了以下扩展:

extension ComparableBiggerExtension<T extends Comparable<T>> on T {
  bool operator >(T other) => compareTo(other) > 0;
}

并且:

extension ComparableBiggerExtension<T> on Comparable<T> {
  bool operator >(T other) => compareTo(other) > 0;
}

两者都声明了Comparable<T>类型的运算符>,其中T是泛型。但我的问题是除了语法之外还有什么区别吗?

xmq68pz9

xmq68pz91#

它们并不完全相同,考虑下面的程序

void main() {
  print(A() > "example");
}

class A implements Comparable<String> {
  @override
  int compareTo(String other) => 0;
}

extension ComparableBiggerExtension<T extends Comparable<T>> on T {
  bool operator >(T other) => compareTo(other) > 0;
}

这会产生以下错误

: Error: The operator '>' isn't defined for the class 'A'.
extensions.dart:2
- 'A' is from 'bin/extensions.dart'.
extensions.dart:1
Try correcting the operator to an existing operator, or defining a '>' operator.
  print(A() > "example");
            ^

这不起作用的原因是因为A是从Comparable<String>而不是Comparable<A>扩展而来的。
但是,当使用第二个扩展定义时

void main() {
  print(A() > "example");
}

class A implements Comparable<String> {
  @override
  int compareTo(String other) => 0;
}

extension ComparableBiggerExtension2<T> on Comparable<T> {
  bool operator >(T other) => compareTo(other) > 0;
}

程序成功运行,输出如下

false

上面的扩展可以很好地工作,因为A是一个Comparable<String>
换句话说,第一个定义只适用于与自身进行比较的类型,而第二个定义适用于Comparable类型,无论它们是与自身进行比较还是与其他类型进行比较。

相关问题