为什么Dart无法在下面的代码中找出类实例变量

时间:2019-05-11 00:27:51

标签: dart

我想了解为什么Dart可以看到printBye()函数中的对象 b 知道它是 Bye的实例,但是它不知道如何找出实例变量 a ;

class Hello {
  void world<T>(T a) {}
}

class Bye {
  int a = 1;
}

class Something extends Hello {
  @override
  void world<T>(T a) {
    printBye(a);
  }
}

void printBye<T>(T b) {
  print(b);    // prints Instance of Bye
  print(b.a); // error
}

void main() {
  new Something()..world(new Bye());
}

https://dartpad.dartlang.org/527e6692846bc018f929db7aea1af583

编辑:这是实现相同效果的简化代码:

class Bye {
  int a = 1;
}

void printBye<T>(T b) {
  print(b);    // prints Instance of Bye
  print(b.a); // error
}

void main() {
  printBye(new Bye());
}

1 个答案:

答案 0 :(得分:2)

这是一种简单的查看方式:您确实使用printBye调用了Bye,但是可以使用任何其他类型调用它。当您使用printBye调用int时,该int将没有.a。因此,您必须假设printBye可以被任何东西调用。 Object代表每一个类派生出来的任何东西。

如果您确定将使用Bye或子类来调用它,则可以这样做来消除错误:

class Bye {
  int a = 1;
}

void printBye<T extends Bye>(T b) {
  print(b);    // prints Instance of Bye
  print(b.a);  // not an error anymore
}

void main() {
  printBye(new Bye());
}

更多信息:https://dart.dev/guides/language/language-tour#restricting-the-parameterized-type