在DART中,'和'=='有什么区别? [英] What is the difference between 'is' and '==' in Dart?

查看:0
本文介绍了在DART中,'和'=='有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有:

class Test<T> {
  void method() {
    if (T is int) {
      // T is int
    } 

    if (T == int) {
      // T is int
    }
  }
}
我知道我可以覆盖==运算符,但如果我不覆盖任何运算符,==is在DART中的主要区别是什么。


编辑:

假设我有

extension MyIterable<T extends num> on Iterable<T> {
  T sum() {
    T total = T is int ? 0 : 0.0; // setting `T == int` works
    for (T item in this) {
      total += item;
    }
    return total;
  }
}

当我将我的扩展方法与以下内容一起使用时:

var addition = MyIterable([1, 2, 3]).sum();

我收到此错误:

类型"Double"不是类型"int"的子类型

推荐答案

  • identical(x, y)检查x是否与y是同一对象。

  • x == y检查x是否应被视为等于ydefault implementation for operator ==identical()相同,但operator ==可以被重写以执行深度相等性检查(或者在理论上可以是病态的,可以实现为执行任何操作)。

  • x is T检查x是否具有T类型。x对象实例

class MyClass {
  MyClass(this.x);

  int x;

  @override
  bool operator==(dynamic other) {
    return runtimeType == other.runtimeType && x == other.x;
  }

  @override
  int get hashCode => x.hashCode;
}

void main() {
  var c1 = MyClass(42);
  var c2 = MyClass(42);
  var sameC = c1;

  print(identical(c1, c2));    // Prints: false
  print(identical(c1, sameC)); // Prints: true

  print(c1 == c2);    // Prints: true
  print(c1 == sameC); // Prints: true

  print(c1 is MyClass);      // Prints: true
  print(c1 is c1);           // Illegal.  The right-hand-side must be a type.
  print(MyClass is MyClass); // Prints: false
}

注意最后一个案例:MyClass is MyClassfalse,因为左侧是类型,而不是MyClass实例。(但是,MyClass is Type将是true。)

在您的代码中,T is int是不正确的,因为两边都是类型。在这种情况下,您需要T == int。请注意,T == int将检查精确的类型,如果其中一个是另一个的派生类型,则不为真(例如,int == num将为假)。

这篇关于在DART中,&amp;#39;和&amp;#39;==&amp;#39;有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆