gpt4 book ai didi

reflection - 我不明白Dart镜子中 “isSubtypeOf”的工作方式

转载 作者:行者123 更新时间:2023-12-03 03:46:50 24 4
gpt4 key购买 nike

根据此测试,我无法使用参数“列表”调用方法“方法”,因为参数类型与方法参数的类型不兼容。

我的考试哪里错了?

import "dart:mirrors";

void main() {
var list = new List<String>();
var listMirror = reflectClass(list.runtimeType);
// Is "List<String>" subtype of "List<String>"?
print(listMirror.isSubtypeOf(listMirror));
// Method with parameter "List<String>"
var method = (List<String> list) {};
var closure = reflect(method) as ClosureMirror;
var function = closure.function;
var parameter = function.parameters.first;
// Is "List<String>" subtype of "List<String>"?
print(parameter.type.isSubtypeOf(listMirror));
print(listMirror.isSubtypeOf(parameter.type));
// Invoke method with arg: "List<String>" on param "List<String>"
method(list);
}

输出:
true
false
false

附言

也许我听不懂,但是还是行不通。

import "dart:mirrors";

void main() {
var stringMirror = reflectClass(String);
// Query "List<int> get codeUnits"
MethodMirror method = stringMirror.declarations.values
.where((e) => e.simpleName == #codeUnits).first;

// List<int>
var returnType = method.returnType;
print(returnType);

// List
var baseType = reflectClass(List);
print(baseType);

// List<int> is List
print(returnType.isSubtypeOf(baseType));
}

输出:
ClassMirror on 'List'
ClassMirror on 'List'
false

最佳答案

这是罪魁祸首:

var listMirror = reflectClass(list.runtimeType);

它返回

ClassMirror on '_GrowableList'

如果您使用

var listMirror = reflectType(List);

它应该工作。

在运行时需要从值获取类型时可以做什么

var listMirror = reflect(list).type.superinterfaces;
...
listMirror.forEach((e) => print(parameter.type.isSubtypeOf(e)));

根据情况,您可能需要进行其他检查

reflect(list).type.mixin;

如果这些检查之一为真,则为子类型。

关于reflection - 我不明白Dart镜子中 “isSubtypeOf”的工作方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com