java invoke 泛型_java中的泛型

本文将详细介绍java泛型的用法以及泛型的原理

java泛型

泛型是在J2 SE1.5中引入的一个特性 可以将类型抽象为一个参数 从而简化代码和实现类型安全

如何使用泛型

泛型可以用于方法 类和接口 通过尖括号加标识符的方式声明

class GenericityClass{

T t;publicGenericityClass(T t)

{this.t =t;

}publicT getT()

{returnt;

}

}interface GenericityInterface{voidprintGenericity(T t);

}public static A test(A a)

{

System.out.println(a);returna;

}

其中类型T是一个不确定的类型 需要填入实际类型才能使用

ps1: 可以给泛型参数起任意名称 例如

ps2: 可以声明任意个泛型参数 不同的泛型参数用','隔开 例如

使用泛型类,方法与普通的类,方法并没有太大区别 除了要填入尖括号和类型

GenericityClass gc = new GenericityClass("泛型类测试");

String s=gc.getT();

Main.test("泛型方法测试");

因为编译器推导的存在 我们可以省略一些重复的类型信息

GenericityClass gc = new GenericityClass<>("泛型类测试");//前边的已经声明了类型 后边的就可以省略

String s =gc.getT();

Main.test("泛型方法测试");//后边填入的参数String已经确定了泛型参数的类型 因此可以省略

java泛型的实现原理

java的泛型实现机制并不是类似c++编译时模板生成 也不是c#运行时生成泛型类 而是利用了一套泛型擦除机制

通过观察编译后的字节码 我们发现 编译器将所有的泛型参数都处理成Object类型

classGenericityClass

{

Object t;publicGenericityClass(Object t)

{this.t =t;

}publicObject getT()

{returnt;

}

}interfaceGenericityInterface

{voidprintGenericity(Object t);

}public staticObject test(Object a)

{

System.out.println(a);returna;

}

GenericityClass gc = new GenericityClass("泛型类测试");

String s= (String) gc.getT();//因为返回值是Object所以要强制转换

BlueBridge.test("泛型方法测试");

我们可以用反射来验证这一点  如果是泛型擦除 那么List的实际类型应该是List

List list = new ArrayList<>();

list.add("这是String");

list.add("这也是String");

list.add("这还是String");try{

List.class.getMethod("add", Object.class).invoke(list, (Object) new int[] {1, 2, 3});

}catch (IllegalAccessException | InvocationTargetException |NoSuchMethodException e) {

e.printStackTrace();

}for(Object obj : list)

{

System.out.println(obj);

}

运行结果

这是String

这也是String

这还是String

[I@4554617c

于是我们在一个List中成功插入了一个int数组

为什么java要使用泛型擦除机制来实现泛型

为了兼容旧版本代码

java的泛型是在J2 SE1.5中加入的 在此之前的通用容器都是将对象转为Object储存   List编译后就成了List 完美兼容旧版本

但是这也带来了一些缺陷 泛型不能是基本类型 所有基本类型必须转为对应的包装类 例如List  这个过程中产生了装箱 导致效率损失

听说之后版本的java会引入一些机制来解决基本类型装箱问题 但那可能得等到猴年马月了

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值