假设我有一个以泛型类型作为参数的函数。我如何在该函数中检查泛型类型参数是否可为空?我想这样做:
void func<T>() { print(T is nullable); } void main(){ func<int>(); //prints false func<int?>(); //prints true }
我所能想到的就是检查T.toString()是否以?结尾,这非常古怪。
T.toString()
?
pjngdqdw1#
尝试:
bool isNullable<T>() => null is T;
rjzwgtxy2#
接受的答案实际上只是检查类型是否可以为null。它不关心您正在操作null操作符的类型。如果你想检查一个类型是否是一个特定的可空类型,也就是说,如果你想检查一个类型是否是DateTime?而不是String?,你不能在dart中通过T == DateTime?来做这件事,因为这与三元运算符语法冲突。然而,由于dart允许将可空类型传递到泛型参数中,因此可以这样做:
DateTime?
String?
T == DateTime?
bool isType<T, Y>() => T == Y;
isType<T, DateTime?>()工作。
isType<T, DateTime?>()
lf5gs5x23#
它创建了一个新的List示例,通过使用支持继承的is运算符来验证它的类型是否可以为空:
is
bool isNullable<T>() => <T?>[] is List<T>;
xurqigkl4#
我在T类型上创建了一个扩展方法来检查null。
T
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 }
4条答案
按热度按时间pjngdqdw1#
尝试:
rjzwgtxy2#
接受的答案实际上只是检查类型是否可以为null。它不关心您正在操作null操作符的类型。
如果你想检查一个类型是否是一个特定的可空类型,也就是说,如果你想检查一个类型是否是
DateTime?
而不是String?
,你不能在dart中通过T == DateTime?
来做这件事,因为这与三元运算符语法冲突。然而,由于dart允许将可空类型传递到泛型参数中,因此可以这样做:
isType<T, DateTime?>()
工作。lf5gs5x23#
它创建了一个新的List示例,通过使用支持继承的
is
运算符来验证它的类型是否可以为空:xurqigkl4#
我在
T
类型上创建了一个扩展方法来检查null。这些检查都通过了