老铁们,大家好,相信还有很多朋友对于全方位解析:泛型技术应用与未来趋势和的相关问题不太懂,没关系,今天就由我来为大家分享分享全方位解析:泛型技术应用与未来趋势以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
私有泛型标识符/*(成员变量类型)*/var;
……
}
示例
//这里T可以写成任何标识符。常用参数如T、E、K、V等常用来表示泛型。
//实例化泛型类时,必须指定T的具体类型
公共类通用{
//key成员变量的类型为T,T的类型是外部指定的
私人T 密钥;
//泛型构造函数的形参key的类型也是T,T的类型是外部指定的。
公共通用(T键){
this.key=键;
}
//泛型方法getKey的返回值类型为T,T的类型是外部指定的
公共T getKey(){
返回键;
}
}
//泛型类型参数只能是类类型(包括自定义类),不能是简单类型
//传入的实际参数的类型必须与泛型的类型参数相同,均为Integer。
GenericgenericInteger=new Generic(123456);
//传入的实际参数类型必须与泛型的类型参数类型相同,即String。
GenericgenericString=new Generic("key_vlaue");
Log.d("通用测试", "密钥是" + genericInteger.getKey());
Log.d("通用测试", "密钥是" + genericString.getKey());注意:泛型的类型参数只能是类类型,不能是简单类型。 instanceof 操作不能用于精确的泛型类型。如果下面的操作不合法,编译时就会出错。
例如: if(str instanceof Generic){ }
泛型接口
定义
//定义通用接口
公共接口生成器{
公共T下一个();
}
示例
正确使用
/**
* 传入泛型参数时:
* 定义一个生产者来实现这个接口。虽然我们只是创建了一个泛型接口Generator*,但是我们可以为T传入无数的实际参数,从而形成无数类型的Generator接口。
* 实现类实现泛型接口时,如果泛型类型已经传入实参类型,则所有使用泛型的都必须替换为传入的实参类型。
* 即:生成器,T in public T next();必须替换为传入的String 类型。
*/
公共类FruitGenerator 实现生成器{
private String[] 水果=new String[]{"苹果", "香蕉", "梨"};
@覆盖
公共字符串下一个(){
随机兰特=new Random();
返回水果[rand.nextInt(3)];
}
}
错误使用
/**
* 当没有传入泛型参数时,定义与泛型类相同。声明类时,还必须在类中添加泛型类型的声明。
* 即: class FruitGeneratorimplements Generator{
* 如果没有声明泛型类型,比如class FruitGeneratorimplementsGenerator,编译器会报错:"Unknown class"
*/
FruitGenerator类实现生成器{
@覆盖
公共T下一个(){
返回空值;
}
}
泛型方法
定义
/**
* 通用方法
* @param clazz 传入通用参数
* @return T 返回值类型为T
* 阐明:
* 1)public和return value之间的中间很重要,可以理解为声明这个方法为泛型方法。
* 2) 只有声明的方法才是泛型方法。在泛型类中使用泛型的成员方法不是泛型方法。
* 3) 表示该方法将使用泛型类型T。只有这样,泛型类型T才能在方法中使用。
* 4) 和泛型类的定义一样,这里的T可以写成任意标识符。 T、E、K、V 等形式的通用参数常用于表示泛型。
*/
publicT genericMethod(Classclazz) 抛出InstantiationException,IllegalAccessException {
T 实例=clazz.newInstance();
返回实例;
}
/**
* 泛型方法,可变参数
* @param args 传入泛型变量参数
*/
publicvoid printMsg(T. args) {
for(T t : args){
Log.d("通用测试","t 是" + t);
}
}
简单示例
//主要方法
公共静态无效主(字符串[] strs){
//通过泛型方法创建对象
对象obj=genericMethod(Class.forName("android.app.Activity"));
}
深入泛型方法示例
公共类GenericFruit {
水果类{
@覆盖
公共字符串toString() {
返回“水果”;
}
}
Apple 类扩展了Fruit{
@覆盖
公共字符串toString() {
返回“苹果”;
}
}
类人{
@覆盖
公共字符串toString() {
返回“人”;
}
}
类生成测试{
公共无效show_1(T t){
System.out.println(t.toString());
}
//在泛型类中声明泛型方法,使用泛型E。这个泛型E可以是任何类型。类型可以与T相同,也可以不同。
//由于泛型方法在声明时就声明了泛型类型,因此即使泛型类中没有声明泛型类型,编译器也能正确识别泛型方法中识别的泛型类型。
publicvoid show_3(E t){
System.out.println(t.toString());
}
//在泛型类中声明泛型方法,使用泛型T。注意,这个T是一个全新的类型,可能与泛型类中声明的T不是同一类型。
publicvoid show_2(T t){
System.out.println(t.toString());
}
}
公共静态无效主(字符串[] args){
苹果苹果=新苹果();
人人=new Person();
生成测试generateTest=new 生成测试();
//apple 是Fruit 的子类,所以它在这里起作用
生成测试.show_1(苹果);
//编译器会报错,因为泛型类型参数指定为Fruit,而传递的参数类为Person。
//generateTest.show_1(person);
//两种方法都可以使用成功
生成测试.show_2(苹果);
生成测试.show_2(人);
//两种方法都可以使用成功
生成测试.show_3(苹果);
生成测试.show_3(人);
}
}
静态方法与泛型
公共类静态生成器{
.
.
/**
* 如果在类中使用泛型定义静态方法,则需要添加额外的泛型声明(将该方法定义为泛型方法)
* 即使静态方法想要使用泛型类中已经声明的泛型类型,也是不能的。
* 例如:public static void show(T t){.},编译器会提示错误信息:
* "StaticGenerator 无法从静态上下文中引用"
*/
公共静态无效显示(T t){
}
}
泛型方法总结
泛型方法使方法能够独立于类而变化。以下是基本指导原则:
只要有可能,就应该使用泛型方法。也就是说,如果你使用泛型方法让整个类泛型,那么你就应该使用泛型方法。另外,对于静态方法,无法访问泛型类型参数。所以如果静态方法想要使用泛型功能,就必须使其成为泛型方法。
泛型优点
1. 类型安全
这是最明显的,泛型的主要目标是提高Java程序的类型安全性。利用泛型定义的变量的类型限制,可以轻松实现编译时的类型检测,避免使用Object带来的大量不必要的类型错误。
如果没有泛型,对象变量的这些类型假设将只存在于程序员的脑海中(或者,如果幸运的话,存在于代码注释中),并且在每次使用之前都需要不安全的强制转换。
2. 代码复用
泛型的一大好处是它提高了代码的可重用性。例如,上面的Generic 类可以访问任何类型的对象,而无需为每种类型编写包装类。
3. 潜在的性能收益
泛型带来了更大优化的可能性。在泛型的初始实现中,编译器将强制转换(没有泛型,程序员将指定这些强制转换)插入到生成的字节码中。但事实上,编译器可以使用更多类型信息,这为JVM 的未来版本提供了优化的可能性。由于泛型的实现方式,支持泛型(几乎)不需要JVM 或类文件更改。所有工作都是在编译器中完成的,它生成的代码与您在没有泛型(和强制转换)的情况下编写的代码类似,只是类型更安全。 Java语言中引入泛型的优点是安全和简单。泛型的优点是在编译期间检查类型安全性,并且所有强制转换都是自动且隐式的,从而提高了代码重用性。
PECS原则
如果要从集合中读取T类型的数据而无法写入,可以使用?扩展通配符; (生产者扩展)如果想从集合中写入T类型的数据并且不需要读取,可以使用?超级通配符; (消费者超级)如果您想同时保存和检索,则不要使用任何通配符。参考:
java泛型详解
【全方位解析:泛型技术应用与未来趋势】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想学一学泛型的知识,感觉会把代码写的更简洁.
有19位网友表示赞同!
我以前写代码的时候没接触过泛型,现在看起来真是太棒了!
有18位网友表示赞同!
泛型能让代码更加灵活好用,值得学习。
有11位网友表示赞同!
觉得在实际开发中运用泛型能提高效率挺多。
有14位网友表示赞同!
学了泛型以后发现原来编程可以这么优雅。
有12位网友表示赞同!
感觉泛型的概念有点抽象,需要好好消化一下。
有16位网友表示赞同!
想问问有没有一些好用的泛型教程推荐?
有12位网友表示赞同!
学习泛型是一个不断精益的过程,需要多练习。
有14位网友表示赞同!
泛型能解决很多通用性的问题,让人真是太方便了!
有9位网友表示赞同!
用泛型的代码看起来更清晰易懂,对新手特别友好。
有17位网友表示赞同!
现在好多项目都用上泛型了吧?
有5位网友表示赞同!
感觉泛型是必修课,想学到真本事就必须掌握。
有10位网友表示赞同!
泛型确实能提高代码复用率,节省时间和精力。
有11位网友表示赞同!
我之前写了一段使用泛型的代码,感觉很棒!
有18位网友表示赞同!
学习泛型需要有一定的编程基础吧?
有20位网友表示赞同!
想找到一些实际案例来学习泛型。
有8位网友表示赞同!
泛型应用的场景还挺广泛的,有机会可以多了解一下。
有6位网友表示赞同!
现在在用的开发语言中有泛型吗?
有16位网友表示赞同!
感觉学习泛型需要一定的逻辑思维能力。
有9位网友表示赞同!