最近,我发现自己遇到了一种情况,我想检查一种类型是否是另一种类型的子类型,这就是我所尝试的
abstract class Record{} class TimeRecord extends Record{} void test(){ print(TimeRecord is Record); // return false but why ?? }
vyu0f0g11#
检查一个类型是否是另一个类型的子类型只有在至少有一个类型是类型 * 变量 * 时才有意义。(否则,您可以查看源代码并将常量true或false写入代码)。有一种方法可以检查一个类型是否是另一个类型的子类型,它确实使用了is操作符,但是你需要有一个 instance 作为第一个操作数,一个type作为第二个操作数。你不能只创建一个未知类型的示例,所以我们依赖于Dart的协变泛型:
true
false
is
bool isSubtype<S, T>() => <S>[] is List<T>;
(You可以使用任何泛型类,甚至可以创建自己的类,而不用使用List。它所需要的只是一种创建对象的方法。)然后你可以写:
List
print(isSubtype<TimeRecord, Record>()); // true!
q7solyqu2#
is关键字用于检查对象示例是否是T类型的对象,而不是is类型的对象:
T
abstract class Record{} class TimeRecord extends Record{} void test(){ print(TimeRecord() is Record); // returns true! }
zsbz8rwp3#
你可以试试这个
abstract class Record{} class TimeRecord extends Record{} void test(){ const TimeRecord? t = null; print(t is Record?); // return true. }
3条答案
按热度按时间vyu0f0g11#
检查一个类型是否是另一个类型的子类型只有在至少有一个类型是类型 * 变量 * 时才有意义。(否则,您可以查看源代码并将常量
true
或false
写入代码)。有一种方法可以检查一个类型是否是另一个类型的子类型,它确实使用了
is
操作符,但是你需要有一个 instance 作为第一个操作数,一个type作为第二个操作数。你不能只创建一个未知类型的示例,所以我们依赖于Dart的协变泛型:(You可以使用任何泛型类,甚至可以创建自己的类,而不用使用
List
。它所需要的只是一种创建对象的方法。)然后你可以写:
q7solyqu2#
is
关键字用于检查对象示例是否是T
类型的对象,而不是is
类型的对象:zsbz8rwp3#
你可以试试这个