我有一个constructor:
PuzMat.fromMatrix(List<List<T>> data) { _layers.add(data); }
字符串我错误地传递了一个List<List<List<T>>>,它就吞了它。我想防止这种情况发生,但是如果我检查类型,我的编辑器说它总是假的。我在想泛型在dart中的工作方式很奇怪,它会接受T是List<T>。但是这是一个递归类型,所以我不明白为什么它是允许的。有什么方法可以防止用户输入错误的类型吗?
List<List<List<T>>>
T
List<T>
avwztpqn1#
Dart泛型系统无法在编译时表示“is not”或“doesn't extend”。List是一个完全合理的类型传递到这里,并且没有根本的理由应该禁止它(它不是递归的)。你真的在这里指List吗?传递Set<T>可以吗?为什么你认为List<List<List<T>>>是一个特殊的问题类型?但是如果你想禁止它,它只能在运行时完成。例如,在你的函数中,你可以添加一个Assert:
List
Set<T>
assert(data is! List);
字符串这将帮助开发人员避免这个错误(如果它是一个错误)。另一种(可能更好)方法是声明T必须扩展的一些基本类型,而不扩展List。这将限制可以传递给您实际想要的东西的内容。但是Dart无法在编译时表示“除了List之外的所有类型”。
1条答案
按热度按时间avwztpqn1#
Dart泛型系统无法在编译时表示“is not”或“doesn't extend”。
List
是一个完全合理的类型传递到这里,并且没有根本的理由应该禁止它(它不是递归的)。你真的在这里指List吗?传递Set<T>
可以吗?为什么你认为List<List<List<T>>>
是一个特殊的问题类型?但是如果你想禁止它,它只能在运行时完成。例如,在你的函数中,你可以添加一个Assert:
字符串
这将帮助开发人员避免这个错误(如果它是一个错误)。
另一种(可能更好)方法是声明
T
必须扩展的一些基本类型,而不扩展List。这将限制可以传递给您实际想要的东西的内容。但是Dart无法在编译时表示“除了List之外的所有类型”。