如何比较如果使用泛型的类型相同?

时间:2019-12-17 23:01:30

标签: dart

假设我有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方法,但是类型不同。

2 个答案:

答案 0 :(得分:3)

实际上,与其他语言(如Java)不同,Dart没有泛型的类型擦除功能。这意味着您的示例 中的objetcs abc是不同的类型。

如果您

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]);

注意:这当然是一个可怕的黑客攻击。