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

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());
}

最佳答案

这是一种简单的查看方式:您确实使用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

07-24 21:30