dart 中的 dynamic

简介: dart 中的 dynamic

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{
  @override
  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{
  @override
  String eat(){return 'meat';}
}
复制代码

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

a(val){ return val; }
print(a(1)) // 1
print(a('a')) // a
复制代码

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

目录
相关文章
|
3月前
|
Dart C语言 Windows
Dart ffi 使用问题之要生成plugin_ffi_sample_bindings_generated.dart文件该如何操作
Dart ffi 使用问题之要生成plugin_ffi_sample_bindings_generated.dart文件该如何操作
|
3月前
|
Dart API 开发工具
Dart ffi 使用问题之Dart API要在C++中使用,该如何初始化
Dart ffi 使用问题之Dart API要在C++中使用,该如何初始化
|
3月前
|
Dragonfly Dart NoSQL
Dart ffi 使用问题之在Dart中调用String的toNativeUtf8方法时有什么是需要注意的
Dart ffi 使用问题之在Dart中调用String的toNativeUtf8方法时有什么是需要注意的
|
缓存 程序员 编译器
译|There Are No Reference Types in Go
译|There Are No Reference Types in Go
74 0
|
XML JSON Dart
《深入浅出Dart》Dart的Isolate
Dart的Isolate Isolate 是 Dart 中进行并发编程的一种方式。由于 Dart 是单线程模型,因此在需要处理 CPU 密集型任务或需要执行长时间运行的操作时,可以使用 Isolate。以下列出了一些常见的 Isolate 应用场景: 创建 Isolate 在 Dart 中,所有的代码都运行在一个单线程中,这个线程被称为主 Isolate。如果你需要执行耗时的计算,你可以创建一个新的 Isolate,然后在这个新的 Isolate 中执行你的计算。
160 0
|
API Android开发
Flutter导入第三方包后报错The number of method references in a .dex file cannot exceed 64K
Flutter导入第三方包后报错The number of method references in a .dex file cannot exceed 64K
|
Dart 编译器
Functions Paramaters——Dart
Dart是一个完全面向对象的语言,它的方法也是对象,对应的类型为Function。 这意味着方法也能被赋值给变量,或者当做参数传递给其他方法。
|
Dart JavaScript 前端开发
Functions——Dart
Dart是一个完全面向对象的语言,它的方法也是对象,对应的类型为Function。 这意味着方法也能被赋值给变量,或者当做参数传递给其他方法。
|
Dart
使用 dart extension
使用 dart extension
104 0
|
Dart
dart 类型提升
dart 类型提升
119 0