Array

变更梗概

变更详情

Array初始化变更

  • ArkTS1.2版本Array初始化时需要多加一个参数为初始值。

ArkTS1.1版本签名:
new Array<T>(arrayLength: number):Array<T>

参数:

参数名 类型 必填 说明
arrayLength number 数组长度。

返回值:

类型 说明
Array<T> 指定类型为T(自定义类型)的数组。

示例:

let a = new Array<number>(100);

ArkTS1.2版本签名:
Array.create<T>(arrayLength: number, initialValue: T):Array<T>

参数:

参数名 类型 必填 说明
arrayLength number 数组长度。
initialValue T 自定义泛型初始化值。

返回值:

类型 说明
Array<T> 指定类型为T(自定义类型)的数组。

示例:

let a = Array.create<number>(100, 0);
  • 适配建议: 增加初始值。

Symbol.iterator变更

ArkTS1.1版本签名:
[Symbol.iterator](): IterableIterator<T>

返回值:

类型 说明
IterableIterator<T> 数组的迭代器对象。

示例:

let a = new Array([1, 2, 3]);
let iter = Reflect.get(a, Symbol.iterator);

ArkTS1.2版本签名:
$_iterator(): IterableIterator<T>

返回值:

类型 说明
IterableIterator<T> 数组的迭代器对象。

示例:

let a: Array<number> = new Array<number>(1, 2, 3);
let iter: IterableIterator<number> = a.$_iterator();
  • 适配建议: 建议仅使用for...of访问迭代器,不要显示访问迭代器。

concat方法参数变更

ArkTS1.1版本签名:
concat(...items: (T | ConcatArray<T>)[]): T[]

参数:

参数名 类型 必填 说明
items (T | ConcatArray<T>)[] 要连接的项或数组。

返回值:

类型 说明
T[] 连接后的新数组。

示例:

let arr1=new Array<number>();
let arr2=new Array<number>();
arr1.concat(1, arr2)

ArkTS1.2版本签名:
不支持。

  • 适配建议: 将单个成员改成数组再使用concat。
    let arr1=new Array<number>();
    let arr2=new Array<number>();
    let arr3=new Array<number>();
    arr3.push(1);
    arr1.concat(arr3, arr2);
    

every方法签名变更

ArkTS1.1版本签名:

  • every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean
  • every<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[]

参数:

参数名 类型 必填 说明
predicate function 测试函数。
thisArg any 执行callback时使用的this值,默认值为当前实例对象,默认值为undefined。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

predicate函数返回值说明:

类型 说明
unknown 返回值会被隐式转换为boolean,决定当前元素是否通过检查。

返回值:

类型 说明
boolean 表示是否通过所有元素都测试,true表示全部通过,false表示全部不通过。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  compare(value: number, index: number, arr: Array<number>) {
      return value < this.base;
  }
}

let arr: Array<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(4);
arr.every(a.compare, a); // false
arr.every(a.compare, b); // true

ArkTS1.2版本签名:
every(predicate: (value: T, index: number, array: Array<T>) => boolean): boolean

参数:

参数名 类型 必填 说明
predicate function 测试函数。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

predicate函数返回值说明:

类型 说明
boolean 表示当前元素是否通过检查,true表示当前元素通过检查,false表示未通过。

返回值:

类型 说明
boolean 表示是否通过所有元素都测试,true表示全部通过,false表示全部不通过。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  callEvery(arr: Array<number>): boolean {
      return arr.every((value: number, index: number, arr: Array<number>)=>{return value < this.base});
  }
}

function main() {
  let arr: Array<number> = new Array<number>(1, 2, 3);
  let a = new C(2);
  let b = new C(4);
  a.callEvery(arr); // false
  b.callEvery(arr); // true
}
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

filter方法签名变更

ArkTS1.1版本签名:

  • filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]
  • filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[]
  • filter<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): S[]

参数:

参数名 类型 必填 说明
predicate function 测试函数。
thisArg any 执行callback时使用的this值,默认值为undefined。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

predicate函数返回值说明:

类型 说明
unknown 返回值会被隐式转换为boolean,决定当前元素是会被过滤。

返回值:

类型 说明
T[] 通过测试的元素组成的新数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  compare(value: number, index: number, arr: Array<number>) {
      return value < this.base;
  }
}

let arr: Array<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
arr.filter(a.compare, a); // [1]
arr.filter(a.compare, b); // [1, 2]

ArkTS1.2版本签名:
filter(fn: (v: T, i: number, self: Array<T>) => boolean): Array<T>

参数:

参数名 类型 必填 说明
fn function 测试函数。

fn函数参数说明:

参数名 类型 必填 说明
v T 当前被遍历的数组元素的值。
i number 当前元素的索引。
self Array<T> 调用的原始数组。
boolean 表示是否过滤当前元素,true表示保留当前元素,false表示过滤掉当前元素。

返回值:

类型 说明
Array<T> 通过测试的元素组成的新数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  call(arr: Array<number>): Array<number> {
      return arr.filter((value: number, index: number, arr: Array<number>)=>{return value < this.base});
  }
}

function main() {
  let arr: Array<number> = new Array<number>(1, 2, 3);
  let a = new C(2);
  let b = new C(3);
  a.call(arr); // [1]
  b.call(arr); // [1, 2]
}
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

find方法签名变更

ArkTS1.1版本签名:

  • find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T | undefined
  • find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S, thisArg?: any): S | undefined

参数:

参数名 类型 必填 说明
predicate function 测试函数。
thisArg any 执行callback时使用的this值,默认值为undefined。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

predicate函数返回值说明:

类型 说明
unknown 返回值会被隐式转换为boolean,判断当前是否找到匹配项。

返回值:

类型 说明
T undefined

示例:

class C {
  base: number;
  constructor(base:number) {
    this.base = base;
  }
  compare(value: number, index: number, arr: Array<number>) {
    return value >= this.base
  }
}

let arr: Array<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
arr.find(a.compare, a); // 2
arr.find(a.compare, b); // 3

ArkTS1.2版本签名:
find(predicate: (value: T, index: number, arr: Array<T>) => boolean): T | undefined

参数:

参数名 类型 必填 说明
predicate function 测试函数。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array Array<T> 调用的原始数组。

predicate函数返回值说明:

类型 说明
boolean 表示当前是否找到匹配项,true表示找到,false表示没找到。

返回值:

类型 说明
T undefined

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  call(arr: Array<number>) {
      return arr.find((value: number, index: number, arr: Array<number>)=>{return value >= this.base});
  }
}

function main() {
let arr: Array<number> = new Array<number>(1, 2, 3);
  let a = new C(2)
  let b = new C(3)
  a.call(arr); // 2
  b.call(arr); // 3
  
  console.info(a.call(arr));
  console.info(b.call(arr));
}
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

findIndex方法签名变更

ArkTS1.1版本签名:
findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): number

参数:

参数名 类型 必填 说明
predicate function 测试函数
thisArg any 执行callback时使用的this值,默认值为undefined。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
obj T[] 调用的原始数组。

predicate函数返回值说明:

类型 说明
boolean 表示当前是否找到匹配项,true表示找到,false表示没找到。

返回值:

类型 说明
number 第一个通过测试元素的索引,未找到则返回-1表示未找到满足的元素。

示例:

class C {
  base: number;
  constructor(base:number) {
    this.base = base;
  }
  compare(value: number, index: number, arr: Array<number>) {
    return value >= this.base;
  }
}

let arr: Array<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
arr.findIndex(a.compare, a); // 1
arr.findIndex(a.compare, b); // 2

ArkTS1.2版本签名:
findIndex(predicate: (value: T, index: number, array: Array<T>) => boolean): number

参数:

参数名 类型 必填 说明
predicate function 测试函数。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array Array<T> 调用的原始数组。

predicate函数返回值说明:

类型 说明
boolean 表示当前是否找到匹配项,true表示找到,false表示没找到。

返回值:

类型 说明
number 第一个通过测试元素的索引,未找到则返回-1表示未找到满足的元素。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  call(arr: Array<number>): number {
      return arr.findIndex((value: number, index: number, arr: Array<number>)=>{return value >= this.base});
  }
}

function main() {
  let arr: Array<number> = new Array<number>(1, 2, 3);
  let a = new C(2);
  let b = new C(3);
  a.call(arr); // 1
  b.call(arr); // 2
}
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

flat方法移除

ArkTS1.1版本签名:
flat<A, D extends number = 1>(this: A,depth?: D): FlatArray<A, D>[]

参数:

参数名 类型 必填 说明
depth D 指定要提取嵌套数组的结构深度,默认值为1。

返回值:

类型 说明
FlatArray<A, D>[] 包含所有子数组元素的新数组。

示例:

type T = number | T[];
let arr:Array<T> = [[1, [2]], 3, [4, 5]];
arr.flat(2); // [1, 2, 3, 4, 5]

ArkTS1.2版本签名:
不支持。

  • 适配建议: 不使用flat,对于有明确返回值类型的具体的场景自己实现算法。

flatMap方法移除

ArkTS1.1版本签名:
flatMap<U, This = undefined> (callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>,thisArg?: This): U[]

参数:

参数名 类型 必填 说明
callback function 生成新数组元素的函数。
thisArg This 执行callback时使用的this值,默认值为undefined。

callback函数参数说明:

参数名 类型 必填 说明
this This 由 thisArg 指定的上下文默认undefined。
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array Array<T> 调用的原始数组。

callback函数返回值说明:

类型 说明
U|ReadonlyArray<U> 可返回单个值U或U类型的数组。

返回值:

类型 说明
U[] 新数组。

示例:

let arr = [[1, 2], 3, [4, 5]]
arr.flatMap(
    (value, index, array) =>{
        return value;
    }
)

ArkTS1.2版本签名:
不支持。

  • 适配建议: 不使用flatMap。

forEach方法签名变更

ArkTS1.1版本签名:
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void

参数:

参数名 类型 必填 说明
callbackfn function 为每个元素执行的函数。
thisArg any 执行callback时使用的this值,默认值为undefined。

callbackfn函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  foo(value: number, index: number, arr: Array<number>) {
      console.info((value + this.base).toString())
  }
}

let arr: Array<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
arr.forEach(a.foo, a);
arr.forEach(a.foo, b);

ArkTS1.2版本签名:
forEach(callbackfn: (value: T, index: number, array: Array<T>) => void): void

参数:

参数名 类型 必填 说明
callbackfn function 为每个元素执行的函数。

callbackfn函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array Array<T> 调用的原始数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  call(arr: Array<number>) {
      return arr.forEach((value: number, index: number, arr: Array<number>)=>{console.info(value + this.base)});
  }
}

function main() {
  let arr: Array<number> = new Array<number>(1, 2, 3);
  let a = new C(2);
  let b = new C(3);
  a.call(arr);
  b.call(arr);
}
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

map方法签名变更

ArkTS1.1版本签名:
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]

参数:

参数名 类型 必填 说明
callbackfn function 生成新数组元素的函数。
thisArg any 执行callback时使用的this值,默认值为undefined。

callbackfn函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

callbackfn函数返回值说明:

类型 说明
U 映射后的值。

返回值:

类型 说明
U[] 新数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  foo(value: number, index: number, arr: Array<number>) {
      return value + this.base;
  }
}

let arr: Array<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
arr.map(a.foo, a); // [3, 4, 5]
arr.map(a.foo, b); // [4, 5, 6]

ArkTS1.2版本签名:
map<U>(callbackfn: (value: T, index: number, arr: Array<T>) => U): U[]

参数:

参数名 类型 必填 说明
callbackfn function 生成新数组元素的函数。

callbackfn函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array Array<T> 调用的原始数组。

callbackfn函数返回值说明:

类型 说明
U 映射后的值。

返回值:

类型 说明
U[] 新数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  call(arr: Array<number>): Array<number> {
      return arr.map((value: number, index: number, arr: Array<number>)=>{return value + this.base})
  }
}

function main() {
  let arr: Array<number> = new Array<number>(1, 2, 3);
  let a = new C(2);
  let b = new C(3);
  a.call(arr); // [3, 4, 5]
  b.call(arr); // [4, 5, 6]
}
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

from方法签名变更

ArkTS1.1版本签名:

  • static from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]
  • static from<T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]

参数:

参数名 类型 必填 说明
arrayLike ArrayLike<T> 要转换为数组的对象。
mapfn function map函数。
thisArg any 执行mapfn时使用的this值,默认值为undefined。

mapfn函数参数说明:

参数名 类型 必填 说明
v T 当前被遍历的数组元素的值。
k number 当前元素的索引。

mapfn函数返回值说明:

类型 说明
U 返回的一个值,作为新Array的元素

返回值:

类型 说明
U[] 新数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  foo(value: number, index: number) {
      return value + this.base;
  }
}

let arr: Array<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
let arr2 = Array.from(arr, a.foo, a); // [3, 4, 5]
let arr3 = Array.from(arr, a.foo, b); // [4, 5, 6]

ArkTS1.2版本签名:
static from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U): U[] static from<T, U>(iterable: Iterable<T>, mapfn: (v: T, k: number) => U): U[]

参数:

参数名 类型 必填 说明
arrayLike ArrayLike<T> 要转换为数组的对象。
mapfn function map函数。

mapfn函数参数说明:

参数名 类型 必填 说明
v T 当前被遍历的数组元素的值。
k number 当前元素的索引。

mapfn函数返回值说明:

类型 说明
U 返回的一个值,作为新Array的元素

返回值:

类型 说明
U[] 新数组。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  call(arr: Array<number>): Array<number> {
      return Array.from(arr, (value: number, index: number)=>{return value + this.base})
  }
}

function main() {
  let arr: Array<number> = new Array<number>(1, 2, 3);
  let a = new C(2);
  let b = new C(3);
  a.call(arr); // [3, 4, 5]
  b.call(arr); // [4, 5, 6]
}
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

from方法不显示emoji表情修复

ArkTS1.1版本:

示例:

const unicodeCodePoint = 0x1F60A;
const chars = String.fromCodePoint(unicodeCodePoint);
const result = Array.from(chars);
console.info('result:', JSON.stringify(result)); // 输出:"result:",  "["\ud83d","\ude0a"]"

ArkTS1.2版本:

示例:

const unicodeCodePoint = 0x1F60A;
const chars = String.fromCodePoint(unicodeCodePoint);
const result = Array.from(chars);
console.info('result:', JSON.stringify(result)); // 输出:"result:",  "["😊"]" 
  • 适配建议: 无需代码修改。

some方法签名变更

ArkTS1.1版本签名:
some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean

参数:

参数名 类型 必填 说明
predicate function 测试函数。
thisArg any 执行callback时使用的this值,默认值为undefined。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

predicate函数返回值说明:

类型 说明
unknown 返回值会被隐式转换为boolean,判断当前元素是否满足predicate。

返回值:

类型 说明
boolean 表示是否通过所有元素都测试,true表示全部通过,false表示全部不通过。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  foo(value: number, index: number, arr: ReadonlyArray<number>) {
      return value > this.base;
  }
}

let arr: ReadonlyArray<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
arr.some(a.foo, a); // true
arr.some(a.foo, b); // false

ArkTS1.2版本签名:
some(predicate: (value: T, index: number, array: T[]) => boolean): boolean

参数:

参数名 类型 必填 说明
predicate function 测试函数。

predicate函数参数说明:

参数名 类型 必填 说明
value T 当前被遍历的数组元素的值。
index number 当前元素的索引。
array T[] 调用的原始数组。

predicate函数返回值说明:

类型 说明
boolean 表示当前元素是否满足predicatetrue表示满足,false表示不满足。

返回值:

类型 说明
boolean 表示是否通过所有元素都测试,true表示全部通过,false表示全部不通过。

示例:

class C {
  base: number;
  constructor(base:number) {
      this.base = base;
  }
  call(arr: ReadonlyArray<number>) {
      return arr.some(
          (value: number, index: number, arr: ReadonlyArray<number>)=>{return value > this.base}
      );
  }
}
let arr: ReadonlyArray<number> = new Array<number>(1, 2, 3);
let a = new C(2);
let b = new C(3);
console.info(a.call(arr)); // true
console.info(b.call(arr)); // false
  • 适配建议: 删除最后一个参数,不使用显式指定this的语义。若必须使用,可使用闭包。

isArray方法签名变更

  • 参数类型any变更为具体类型,返回值类型为布尔类型。

ArkTS1.1版本签名:
static isArray(arg: any): arg is any[]

参数:

参数名 类型 必填 说明
arg any 要判断的值。

返回值:

类型 说明
arg is any[] 类型守卫,通知编译器当某个条件为true时,arg是一个any[]类型。

示例:

let arr: number[] = [1, 2, 3, 4, 5]
let num: number = 1
console.log(Array.isArray(arr))  // ture
console.log(Array.isArray(num))  // false

ArkTS1.2版本签名:
static isArray(o: Object | null | undefined): boolean

参数:

参数名 类型 必填 说明
o Object | null | undefined 要判断的值。

返回值:

类型 说明
boolean 表示是否是数组。true表示是数组,false表示不是数组。

示例:

let arr: number[] = [1, 2, 3, 4, 5]
let num: number = 1
console.log(Array.isArray(arr))  // ture
console.log(Array.isArray(num))  // false
  • 适配建议: ArkTS1.2相比ArkTS1.1接口签名有变更,但对开发者接口行为无变更。

数组构造函数变更

变更梗概

变更详情

ArrayConstructor-入参为可选数字构造函数调用变更

ArkTS1.1版本签名:
<T>(arrayLength?: number): T[]

参数:

参数名 类型 必填 说明
arrayLength number 数组长度,默认值为0。

返回值:

类型 说明
T[] 新创建的数组。

示例:

let a = Array<number>(10)
function f(a:ArrayConstructor) {
    a(10);
}

ArkTS1.2版本签名:
static Array.invoke(arrayLength?: number): T[]

参数:

参数名 类型 必填 说明
arrayLength number 数组长度,默认值为0。

返回值:

类型 说明
T[] 新创建的数组。

示例:

let a = Array<number>(10);
function f() {
   Array<number>(10);
}
  • 适配建议: 不要使用Constructor类型,使用invoke或new的方式直接创建对象。

ArrayConstructor-入参为剩余参数构造函数调用变更

ArkTS1.1版本签名:
<T>(...items: T[]): T[]

参数:

参数名 类型 必填 说明
...items T[] 表示可以接受任意数量(0或多个)的T类型参数,收集到数组中,默认值为无。

返回值:

类型 说明
T[] 新创建的数组。

示例:

function createArray(ctor: ArrayConstructor) {
    return ctor<number>(1, 2, 3);
}
const num = createArray(Array)
console.info("Array :"+ JSON.stringify(num)) // "Array :[1,2,3]" 

ArkTS1.2版本签名:
static Array.invoke(...items: T[]): Array<T>

参数:

参数名 类型 必填 说明
...items T[] 表示可以接受任意数量(0或多个)的T类型参数,收集到数组中,默认值为无。

返回值:

类型 说明
Array<T> 新创建的数组。

示例:

function createArrayDirect() {
    return Array<number>(1, 2, 3)
}
const num = createArrayDirect()
console.info("Array :"+ JSON.stringify(num)) // "Array :[1,2,3]" 
  • 适配建议: ArkTS1.2没有ArrayConstructor,不允许使用Constructor类型,建议使用invoke或new的方式直接创建对象。