任意类型(Any)
any 装得下任何值,代价是值的类型在编译期未知。
装值与 is 判型
var x: any = 42;
print(x);
x = "现在是一段文本";
print(x);
print(x is string);
x = 3.5;
print(x is float);42
现在是一段文本
True
Trueis 测试值是否为 float 类型,返回 bool。存入 any 的值在编译期丢失具体类型信息,它的方法直接调时会被编译器拦下。收窄之后怎么用收窄出的类型,见模式一页。
Warning
对 any 的成员访问编译期直接拒绝,需要先用 is 收窄再取成员。any 应作为最后手段使用。
any 源参与的转型(o is T、o as T、T(o) 受检转)一律走运行期检查,见类型转换。
is 收窄的实际形状
v is T 对 any 做类型测试,测试通过则可在直条件与 && 链中绑定收窄值:
func Describe(v: any) -> string
{
if v is int n
{
return $"整数 {n}";
}
if v is string s
{
return $"字符串 {s}";
}
return "别的什么";
}
print(Describe(42));
print(Describe("词"));
print(Describe(2.5));整数 42
字符串 词
别的什么收窄只在直条件与 && 链成立:!(v is T p) 取反形与纯 bool 位(val b = v is T p;)则不被允许。后者用不带绑定的 v is T 即可。
装箱语义
any 里的标量是装箱的:运行时每个值都带着自己的真实类型,is 测试与收窄按它判定,与泛型擦除是同族。没有命中任何分支的值落到兜底串(上面 2.5 既不是 int 也不是 string)。
typeof 与类型同一性
print(typeof(int) == typeof(int), typeof(string) == typeof(int));
val v = 3.5;
print(v is float);
print(v is int);True False
True
Falsetypeof(T) 产出类型的 Type 值,可比较、可传递。is 的判定按值与目标类型的相容性走:3.5 是 float 不是 int。
值的运行期真实类型可用 Reflect.TypeOf 查询,映射规则见反射。
异质容器
list<any> 存放异质值,遍历时逐元素 is 收窄是最常见的形态:
val bag = new list<any>();
bag.Add(1);
bag.Add("字");
bag.Add([1, 2]);
for item in bag
{
if item is int n
{
print("int", n);
}
elif item is string s
{
print("str", s);
}
else
{
print("其他");
}
}int 1
str 字
其他数组字面量 [1, 2] 是 int[],不是 int 也不是 string,落进兜底。
代价与边界
- 成员访问被编译期拒绝:any 上的
.字段/.方法()一律不收,必须先is收窄,any 不是万能容器需要避免滥用。 - 判空收窄的豁免域:any 参与的判空不走可空收窄的状态机,
any?要单独判。 - 容器类值装进 any 后,
is list<int>这类泛型实例化测试不匹配(运行时不按实例化参数区分),精确类型判断别依赖它。
最后更新于 2026年10月9日
