dart 中的 dynamic

动态类型dynamic在Dart中允许放弃编译时类型检查,提供灵活性但可能导致运行时错误。dynamic变量未初始化默认为null,初始化后可改变类型。它可以调用任何属性和方法,即使不存在,仅在运行时报错。同时,dynamic类型的变量可以赋值给其他变量,但需在运行时确保兼容,否则会抛出异常。函数未指定返回类型默认为dynamic,类中未定义返回类型的抽象方法同样。
摘要由CSDN通过智能技术生成

dynamic 在 dart 中自由度最大。 让 dart 具有充分的灵活性。如果所有变量都用 dynamic,相当于完全放弃类型检查。

以下示例基于 dart sdk 2.15.1 开启空安全

  1. dynamic 声明的变量如果没有初始化,默认为 null。
dynamic a;
print(a); // null
print(a.runtimeType) // Null
  1. dynamic 声明的变量如果初始化,则会获得初始值,值和值的类型都是可以修改的。
dynamic a=1;
print(a); // 1
print(a.runtimeType) // int

a='hello';
print(a); // hello
print(a.runtimeType) // String
  1. dynamic 声明的变量可以调用任何属性和方法,不会被警告,因为编译器不会对 dynamic 声明的变量在编译阶段进行检查,直到运行时才会报错。
dynamic a=1;
a.b(); // 如果不运行不会看到任何错误提示
print(a.b); // 如果不运行不会看到任何错误提示
  1. dynamic 声明的变量可以赋值给其它变量,但是如果类型不同,运行时会报错
 dynamic a=1;
 int b=2;
 b=a;
 print(b);  // 1
   
 String s='a';
 s=a;  // 运行时报错。
  1. 在得知 dynamic 类型后,可以转换。
dynamic a=1;
if(a is int)  a = a as int; // ok

a= a as String //运行时报错;
  1. 函数如果没有定义返回值类型,返回的类型为 dynamic, 值为 null 。 dynamic 写不写都一样。
a(){}
dynamic a(){}
  1. 对于类中的方法也是一样的,默认返回 dynamic
abstract class Animal{
   eat();
}

class Dog extends Animal{
  
  String eat(){return 'meat';}
}

var dog=Dog();
print(dog.eat()) // meat

在 Animal中 方法 eat 返回 dynamic,子类中的 eat 返回 String 是可以的。写上 dynamic 也是可以的。

abstract class Animal{
 dynamic eat();
}

class Dog extends Animal{
  
  String eat(){return 'meat';}
}

8 函数参数如果没有指定类型也是dynamic

a(val){ return val; }

print(a(1)) // 1
print(a('a')) // a

总之 dynamic 让 dart 在编译时放弃类型检查,只有在运行时才会做类型判断。如果父类没有定义方法的返回值类型,子类可以随意定义方法的返回值类型。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IAM17前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值