我很难理解Dart中的泛型是如何工作的,而文档并没有帮助我。
如果我创建一个名为Checker
的类,该类需要以某种方式存储其泛型参数,那么我可以这样做(因为Dart具有reified
泛型):
class A {}
class B extends A {}
class Checker<T> {
bool test(dynamic a) {
return a is T;
}
}
main() {
print(Checker<A>().runtimeType);
print(Checker<B>().runtimeType);
print(Checker<String>().runtimeType);
print(Checker<A>().test(A()));
print(Checker<A>().test(B()));
print(Checker<A>().test(""));
}
打印出来的结果与您期望的一样:
Checker<A>
Checker<B>
Checker<String>
true
true
false
这里是问题:
class A {}
class B extends A {}
class Checker<T> {
bool testChecker<C>(Checker<C> a) {
return C is T;
}
}
输出:
false
false
false
看来,两个泛化的泛型不能很好地协同工作。
在Java中,这主要是通过存储Class<T>
来解决的,该Type
具有isAssignableFrom
函数,可以完成所声明的操作。在Dart中,runtimeType
只是一个空的抽象类,因此在读取/存储runtimeType
时没有用,因为没有函数可以调用它来检查可分配性关系。 (编辑。:_Type
返回的所有类都是runtimeType
类型,因此它们的任何方法都不能被调用。)
如何在Dart中保存 LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dse_location_list_filter, null);
final Dialog dialog = new Dialog(Acitvity_name.this);
dialog.setContentView(view);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
dialog.show();
?
答案 0 :(得分:0)
如果您将testChecker
更改为return a is Checker<T>;
,就足够了吗?那将是检查a
的 runtime 类型,而不是呼叫点的静态类型。如果需要后者,可以执行return new Checker<C>() is Checker<T>;
。
正确的是,永远不要将Type
对象用于此类操作,因此.runtimeType
毫无用处。
该示例不起作用的原因是它确实return C is T;
。 is
运算符的左边是一个对象,右边是一种类型。因此,C
被评估为对象,这意味着它评估为类型Type
的对象。然后,它检查Type
是否是T
的子类型,不是。
您不能直接比较类型变量,而必须将对象与类型进行比较。一种选择是执行<C>[] is List<T>
-即:检查C
(对象)的 ist是否是T
列表>(类型)。
由于我已经有了通用类,因此我只使用Checker<C>() is Checker<T>
。