我想了解为什么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());
}
答案 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