Dart里命名构造方法,factory方法和static方法的区别:
1.命名构造方法只能返回自己的类型;
2.factory方法可以返回子类类型;
3.static方法可以返回任意类型;
当一个方法即是构造方法,又是factory方法时,它优先是factory方法(具有factory的特性),如external factory List([int? length]);因此List()可以返回其子类(null safety不可调用,因为需要提供fill的值,即有长度时的元素默认值)
lambda表达式分为两种,一种是有=>的,这种最好不要加{},而它的返回值就是表达式的返回值(注意赋值语句返回null,但是注意set比较特别,它不会去对返回类型去求值,因此set mapX(y) => {y}这种写法也是可以的),而没有=>的则要用{}包裹,且里面是语句(和Java一样);
因为set不会去计算返回类型,所以最好不要写void set mapY(y) ...;而是直接写set mapY(y)...;比较合适;
dart里对于SplayTreeSet允许是dynamic是有原因的,比如:
var set = SplayTreeSet((a, b) => a.toString().compareTo(b.toString())); set.add("ss"); set.add(8);
这种情况下就允许key是不同类型;
对于extension里的static方法,可以这么理解,没有加static的方法其实隐式的是
extension IntExtension on int {
(extension) int doubleInt() { // 注意,实际代码里用的时候是没有(extension)的
return this * 2;
}
}
而加了static的则那个隐式的(extension)就没了,因此是针对IntExtension的一个静态方法;【因此doubleInt虽然是编译时转换为一个方法,但是不能看成是静态方法,就像factory方法不能看成static方法一样,虽然用法很像
,3.doubleInt() 甚至编译的时候都不是类似静态方法一样调用,即IntExtension.doubleInt(3),而就是直接变成(3 * 2)】
而且注意,extension是没有构造方法的(也不能显式定义),因此不能初始化一个extension类型的对象;
还有就是extension类型(甚至都不能称之为类型)不能反射(所以它不是Type);