如何在Dart NNBD中检查泛型类型是否可为空?

relj7zay  于 2023-04-09  发布在  其他
关注(0)|答案(4)|浏览(164)

假设我有一个以泛型类型作为参数的函数。我如何在该函数中检查泛型类型参数是否可为空?我想这样做:

void func<T>() {
  print(T is nullable);
}

void main(){
  func<int>(); //prints false
  func<int?>(); //prints true
}

我所能想到的就是检查T.toString()是否以?结尾,这非常古怪。

pjngdqdw

pjngdqdw1#

尝试:

bool isNullable<T>() => null is T;
rjzwgtxy

rjzwgtxy2#

接受的答案实际上只是检查类型是否可以为null。它不关心您正在操作null操作符的类型。
如果你想检查一个类型是否是一个特定的可空类型,也就是说,如果你想检查一个类型是否是DateTime?而不是String?,你不能在dart中通过T == DateTime?来做这件事,因为这与三元运算符语法冲突。
然而,由于dart允许将可空类型传递到泛型参数中,因此可以这样做:

bool isType<T, Y>() => T == Y;

isType<T, DateTime?>()工作。

lf5gs5x2

lf5gs5x23#

它创建了一个新的List示例,通过使用支持继承的is运算符来验证它的类型是否可以为空:

bool isNullable<T>() => <T?>[] is List<T>;
xurqigkl

xurqigkl4#

我在T类型上创建了一个扩展方法来检查null。

extension _Generic<T extends Object?> on T? {
  bool get isNullable {
    try {
      // throws an exception if T is not nullable
      final value = null as T;
      return true;
    } catch (_) {
      return false;
    }
  }
}

这些检查都通过了

void main() {
  print('hello world'.isNullable); // false
  print(1.isNullable); // false
  print(1.0.isNullable); // false
  print(true.isNullable); // false
  print([].isNullable); // false
  print({}.isNullable); // false
  print(null.isNullable); // true
  print(null.runtimeType.isNullable); // false, because `runtimeType` is not nullable
}

相关问题