如何在Dart中创建仅支持两种类型的列表(类似TypeScript)
实现支持两种类型元素的列表方案
1. Java 实现方式
Java没有原生联合类型,但可以通过类型安全的自定义方案实现需求:
方式一:自定义标记接口(强类型安全)
先定义一个标记接口,让目标类型(包括包装后的String)实现它:
// 标记接口,仅用于约束类型 interface StringOrClassType {} // 包装String类,因为String是final无法直接实现自定义接口 class StringWrapper implements StringOrClassType { private final String value; public StringWrapper(String value) { this.value = value; } public String getValue() { return value; } } // 让自定义ClassType实现标记接口 class ClassType implements StringOrClassType { // 你的类业务逻辑 } // 使用约束后的列表 List<StringOrClassType> mixedList = new ArrayList<>(); mixedList.add(new StringWrapper("示例文本")); mixedList.add(new ClassType());
这种写法能严格限制列表元素类型,但存取String时需要通过包装类转换。
方式二:泛型通配符(弱类型约束,适合只读场景)
如果只需要兼容两种类型的读取操作,可借助共同父类,但无法限制其他子类混入:
// 前提是ClassType实现Serializable接口 List<? extends Serializable> mixedList = new ArrayList<>(); mixedList.add("示例文本"); mixedList.add(new ClassType());
此方式灵活性差,类型安全性不足,仅适合简单场景。
2. Python 实现方式
Python 3.10+支持直接用|语法定义联合类型列表,完全贴合你想要的TypeScript风格:
from typing import List # Python 3.10+ 写法 mixed_list: List[str | ClassType] = [] mixed_list.append("示例文本") mixed_list.append(ClassType()) # 旧版本兼容写法(需导入Union) from typing import Union mixed_list: List[Union[str, ClassType]] = []
配合mypy等静态检查工具,能在编码阶段校验元素类型。
3. C# 实现方式
C# 8.0+支持原生联合类型,写法简洁且编译时强校验:
List<string | ClassType> mixedList = new List<string | ClassType>(); mixedList.Add("示例文本"); mixedList.Add(new ClassType());
内容的提问来源于stack exchange,提问作者Gwhyyy
相关产品推荐
相关产品推荐

