一统天下 flutter - dart: 泛型(泛型类,泛型属性,泛型方法,泛型扩展方法)

发布时间 2023-03-22 21:14:06作者: webabcd

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - dart: 泛型(泛型类,泛型属性,泛型方法,泛型扩展方法)

示例如下:

lib\dart\generic.dart

/*
 * dart 泛型(泛型类,泛型属性,泛型方法,泛型扩展方法)
 */

import 'package:flutter/material.dart';
import 'package:flutter_demo/helper.dart';

class DartGeneric extends StatelessWidget {
  const DartGeneric({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    sample1();

    return const MyWidget(text: "dart_generic");
  }

  void sample1() {
    var a = _MyClass<int>().getType();    // type: int
    var b = _MyClass<String>().getType(); // type: String
    // 实例化时如果不指定泛型的具体类型,那么它就是 dynamic
    var c = _MyClass().getType();         // type: dynamic

    var d = _MyClass2<int>().getType();       // type: int
    // String 没有继承 num 所以这句会报错
    // var e = _MyClass2<String>().getType();
    // 实例化时如果不指定泛型的具体类型,那么它就是泛型约束 extends 所指定的类型,本例中就是 num
    var f = _MyClass2().getType();            // type: num

    var g = _MyClass2<int>();
    // 使用泛型方法
    g.setT(100);
    var h = g.getT();                       // 100
    var i = _MyClass2.getFirst([1, 2, 3]);  // 1

    // 使用泛型扩展方法
    var j = g.getType2();                   // type2: int

    log("$a, $b, $c, $d, $f, $h, $i, $j");
  }
}

// 泛型类
class _MyClass<T> {
  String getType() {
    // 获取泛型的具体类型
    return "type: $T";
  }
}

// 泛型类(通过 extends 为泛型添加约束,约束泛型必须要继承 extends 指定的类)
class _MyClass2<T extends num> {
  String getType() {
    // 获取泛型的具体类型
    return "type: $T";
  }

  // 泛型属性和泛型方法
  T v = 0 as T;
  void setT(T v) {
    this.v = v;
  }
  T getT() {
    return this.v;
  }

  // 泛型方法
  static E getFirst<E>(List<E> list) {
    E tmp = list[0];
    return tmp;
  }
}

// 泛型扩展方法
extension _MyExtension<T extends num> on _MyClass2<T> {
  String getType2() {
    return "type2: $T";
  }
}

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd