假设我有select * from fullnames where slug = 'AAACDEELLOV';
类
someClass
如何检查元素class someClass<Generics> {}
someClass<int> a = someClass<int>();
someClass<String> b = someClass<String>();
someClass c = someClass();
是否具有相同类型(a,b,c
)?
在Dart中有可能吗?
我尝试使用someClass
方法,但是类型不同。
答案 0 :(得分:3)
实际上,与其他语言(如Java)不同,Dart没有泛型的类型擦除功能。这意味着您的示例 中的objetcs a
,b
和c
是不同的类型。
如果您
print(a.runtimeType);
print(b.runtimeType);
print(c.runtimeType);`
你会得到
SomeClass<int>
SomeClass<String>
SomeClass<dynamic>
在运行时不会清除通用类型。如果要检查是否所有对象的类型均为SomeClass
,则可以使用
print(a is SomeClass);
print(b is SomeClass);
print(c is SomeClass);
这会给你
true
true
true
答案 1 :(得分:1)
检查格式为 MyObj<T>
的某个对象是否具有精确的泛型类型 T
。
bool isOfExactGenericTypeAs(Object? obj) {
var runtimeTypeStr = obj.runtimeType.toString();
var pos = runtimeTypeStr.lastIndexOf('<');
return runtimeType.toString().endsWith('<${runtimeTypeStr.substring(pos + 1)}');
}
要检查格式为 MyObj<T>
的某个对象是否与另一个对象具有完全相同的泛型类型 T
:
bool isOfExactGenericTypeAs(Object? obj) {
var runtimeTypeStr = obj.runtimeType.toString();
var pos = runtimeTypeStr.lastIndexOf('<');
return runtimeType.toString().endsWith('<${runtimeTypeStr.substring(pos + 1)}');
}
我的包:https://pub.dev/packages/fast_immutable_collections 有两个扩展可以让你像这样使用这些方法:
// True
<int>[1].isOfExactGenericType(int);
// True
<num>[1].isOfExactGenericType(num);
// False
<int>[1].isOfExactGenericType(num);
// False
<num>[1].isOfExactGenericType(int);
// True
<int>[1].isOfExactGenericTypeAs(<int>[1]);
// True
<num>[1].isOfExactGenericTypeAs(<num>[1]);
// False
<num>[1].isOfExactGenericTypeAs(<num>[1]);
// False
<int>[1].isOfExactGenericTypeAs(<num>[1]);
注意:这当然是一个可怕的黑客攻击。