如何获取扩展器或实现器 child 的类型
how to get the extender or implementer child's Type
我有一个 class:
abstract class Foo {
String getName(T f);
}
和:
class Bar implements Foo {}
或
class Bar extends Foo {}
Foo
如何知道Bar
并将T
实现为Bar
?
更新:
我考虑过静态传递 child 的类型,例如:
@override
String getName<Bar>(Bar p1) {
return p1.name;
}
这样我就运行进入这个错误:The property 'name' can't be unconditionally accessed because the receiver can be 'null'. Try making the access conditional (using '?.') or adding a null check to the target ('!').
所以,我将其编辑为:
@override
String getName<Bar>(Bar p1) {
return p1!.name;
}
现在我收到这个错误:The getter 'name' isn't defined for the type 'Bar & Object'. Try importing the library that defines 'name', correcting the name to the name of an existing getter, or defining a getter or field named 'name'.
我想目前唯一的解决方案是使用 dynamic
类型,如下所示:
abstract class Foo {
String getName(f);
}
和
class Bar implements Foo {
@override
String getName(f) {
return (f as Bar).name;
}
}
但我真的很想知道这个问题的答案。
abstract class Foo {
String getName(T f);
}
应该无效。 T
未在任何地方指定。
您需要指定要传递泛型的位置:
abstract class Foo<T> {
String getName(T f);
}
然后在 extend/implement 抽象 class:
时传递泛型
abstract class Foo<T> {
String getName(T f);
}
class Bar implements Foo<Bar> {
final String name = '';
@override
String getName(Bar p1) {
return p1.name;
}
}
如果 getName
将始终接受 Foo
的实现者,您可以删除泛型并改为使用 covariant
关键字:
abstract class Foo {
String getName(covariant Foo f);
}
class Bar implements Foo {
final String name = '';
@override
String getName(Bar p1) {
return p1.name;
}
}
我有一个 class:
abstract class Foo {
String getName(T f);
}
和:
class Bar implements Foo {}
或
class Bar extends Foo {}
Foo
如何知道Bar
并将T
实现为Bar
?
更新: 我考虑过静态传递 child 的类型,例如:
@override
String getName<Bar>(Bar p1) {
return p1.name;
}
这样我就运行进入这个错误:The property 'name' can't be unconditionally accessed because the receiver can be 'null'. Try making the access conditional (using '?.') or adding a null check to the target ('!').
所以,我将其编辑为:
@override
String getName<Bar>(Bar p1) {
return p1!.name;
}
现在我收到这个错误:The getter 'name' isn't defined for the type 'Bar & Object'. Try importing the library that defines 'name', correcting the name to the name of an existing getter, or defining a getter or field named 'name'.
我想目前唯一的解决方案是使用 dynamic
类型,如下所示:
abstract class Foo {
String getName(f);
}
和
class Bar implements Foo {
@override
String getName(f) {
return (f as Bar).name;
}
}
但我真的很想知道这个问题的答案。
abstract class Foo {
String getName(T f);
}
应该无效。 T
未在任何地方指定。
您需要指定要传递泛型的位置:
abstract class Foo<T> {
String getName(T f);
}
然后在 extend/implement 抽象 class:
时传递泛型abstract class Foo<T> {
String getName(T f);
}
class Bar implements Foo<Bar> {
final String name = '';
@override
String getName(Bar p1) {
return p1.name;
}
}
如果 getName
将始终接受 Foo
的实现者,您可以删除泛型并改为使用 covariant
关键字:
abstract class Foo {
String getName(covariant Foo f);
}
class Bar implements Foo {
final String name = '';
@override
String getName(Bar p1) {
return p1.name;
}
}