Dart ';是';和'==';用飞镖?

Dart ';是';和'==';用飞镖?,dart,Dart,假设我有: class Test<T> { void method() { if (T is int) { // T is int } if (T == int) { // T is int } } } 当我使用扩展方法时,比如: var addition = MyIterable([1, 2, 3]).sum(); 我得到这个错误: 类型“double”不是类型“int”的子类型 基本上,==是等式运算符,“i

假设我有:

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

    if (T == int) {
      // T is int
    }
  }
}
当我使用扩展方法时,比如:

var addition = MyIterable([1, 2, 3]).sum();
我得到这个错误:

类型“double”不是类型“int”的子类型


基本上,==是等式运算符“is”是Dart的运算符的实例(如果您来自Java背景,如果不是,它基本上会告诉您某个对象是否属于某个类型)

如果要检查两个对象是否相等,请使用==表示相等。您可以在类中实现==运算符(方法),以定义判断两个对象是否相等的依据

举个例子:

class Car {
    String model;
    String brand;
    Car(this.model, this.brand);

    bool operator == (otherObj) {
        return (otherObj is Car && other.brand == brand); //or however you want to check
        //On the above line, we use "is" to check if otherObj is of type Car
    }
}
现在,您可以根据您定义的条件检查两辆车是否“相等”

void main() {
  final Car micra = Car("Micra", "Nissan");
  print(micra == Car("Micra", "Nissan")); // true
  print(micra is Car("Micra", "Nissan")); // true
}
因此,==是用来决定两个对象是否相等的东西,您可以根据您对两个对象应如何被视为相等的期望来覆盖和设置它

另一方面,“is”基本上告诉您一个实例是否是object类型(这里micra是Car类型)

  • 检查
    x
    是否与
    y
    是同一对象

  • x==y
    检查是否应将
    x
    视为等于
    y
    。与
    idential()
    相同,但是可以重写
    运算符==
    ,以执行深度相等性检查(或者理论上可能是病态的,可以实现任何操作)

  • x是T
    检查
    x
    是否具有类型
    T
    x
    是一个对象实例

class-MyClass{
MyClass(this.x);
int x;
@凌驾
布尔运算符==(动态其他){
返回runtimeType==other.runtimeType&&x==other.x;
}
@凌驾
int get hashCode=>x.hashCode;
}
void main(){
var c1=MyClass(42);
var c2=MyClass(42);
var sameC=c1;
打印(相同(c1,c2));//打印:false
打印(相同(c1,sameC));//打印:真
print(c1==c2);//Prints:true
print(c1==sameC);//Prints:true
print(c1是MyClass);//Prints:true
打印(c1是c1);//非法。右侧必须是一种类型。
print(MyClass是MyClass);//Prints:false
}
注意最后一种情况:
MyClass是MyClass
false
,因为左侧是一个类型,而不是
MyClass
的实例。(
MyClass是Type
将是
true


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

Dart语言教程有关于和运算符的部分。@jamesdlin谢谢,这是否意味着,如果两个对象相等,它们将始终相同?@iKeepChangingName No.
相同
表示完全相同的对象实例。两个独立的对象可以是
==
(具有相同的内部值),但不会是
相同的
@Yudhishthir Singh谢谢你的回答,我已经知道了相同和相等的东西,我已经编辑了我的代码,你可以看到我是否使用
=
代码工作,但使用
是失败的,我原以为会是相反的结果。你能解释一下为什么会有错误吗?@jamesdlin非常感谢你,先生,你帮了我很大的忙,我已经更新了我的代码,你能告诉我有什么问题吗?如果你能给出答案,我会很高兴的。再次感谢:)这可能是最好的答案,非常感谢你,先生,我希望我能投更多的票。
void main() {
  final Car micra = Car("Micra", "Nissan");
  print(micra == Car("Micra", "Nissan")); // true
  print(micra is Car("Micra", "Nissan")); // true
}