幡然的英文译语怎么说-进击的巨人周几更新
2023年刹的多音字组词 4月7日发(作者:中韩文在线翻译)
泛型中的T、E、K、V、?等等,究竟是啥?
点击下⽅“IT牧场”,选择“设为星标”
来源:/post/
5d5789d26f荔枝的功效与作用 b9a06ad0056bd9
前⾔
泛型带来的好处
泛型中通配符
常⽤的T,E,K,V,?
⽆界通配符
上界通配符<?extendsE>
下界通配符<?superE>
和T的区别
Class
⼩结
前⾔
Java泛型(generics)是JDK5中引⼊的⼀个新特性,泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到⾮法的类
型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为⼀个参数。
推荐下⾃⼰做的SpringBoot的实战项⽬:
泛型带来的好处
在没有泛型的情况的下,通过对类型Object的引⽤来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,⽽这种
转换是要求开发者对实际参数类型可以预知的情况下进⾏的。对于强制类型转换错误的情况,编译器可能不提⽰错误,在运⾏的时候才出现
异常,这是本⾝就是⼀个安全隐患。
那么泛型的好处就是在编译的时候能够检查类型安全,并且所有的强制转换都是⾃动和隐式的。
publicclassGlmapperGeneric
privateTt;
publicvoidset(Tt){this.t=t;}
publicTget(){returnt;}
publicstaticvoidmain(String[]args){
//donothing
}
/**
*不指定类型
*/
publicvoidnoSpecifyType(){
GlmapperGenericglmapperGeneric=newGlmapperGeneric();
(\"test\");
//需要强制类型转换
Stringtest=(String)();
n(test);
}
/**
*指定类型
*/
publicvoidspecifyType(){
GlmapperGeneric
(\"test\");
//不需要强制类型转换
Stringtest=();
n(test);
}
}
上⾯这段代码中的specifyType⽅法中省去了强制转换,可以在编译时候检查类型安全,可以⽤在类,⽅法,接⼝上。
推荐下⾃⼰做的Spri商山早行拼音版古诗 ngCloud的实战项⽬:
泛型中通配符
我们在定义泛型类,泛型⽅法,泛型接⼝的时候经常会碰见很多不同的通配符,⽐如T,E,K,V等等,这些通配符⼜都是什么意思呢?
常⽤的T,E,K,V,?
本质上这些个都是通配符,没啥区别,只不过是编码时的⼀种约定俗成的东西。⽐如上述代码中的T,我们山有木兮木有枝神回复 可以换成A-Z之间的任何⼀个
字母都可以,并不会影响程序的正常运⾏,但是如果换成其他的字母代替T,在可读性上可能会弱⼀些。通常情况下,T,E,K,V,?是
这样约定的:
表⽰不确定的java类型
T(type)表⽰具体的⼀个java类型
KV(keyvalue)分别代表java键值中的KeyValue
E(element)代表Element
⽆界通配符
先从⼀个⼩例⼦看起,原⽂在这⾥。
我有⼀个⽗类Animal和⼏个⼦类,如狗、猫等,现在我需要⼀个动物的列表,我的第⼀个想法是像这样的:
List
但是⽼板的想法确实这样的:
List<?extendsAnimal>listAnimals
为什么要使⽤通配符⽽不是简单的泛型呢?通配符其实在声明局部变量时是没有什么意义的,但是当你为⼀个⽅法声明⼀个参数时,它是⾮
常重要的。
staticintcountLegs(List<?extendsAnimal>animals){
intretVal=0;
for(Animalanimal:animals)
{
retVal+=egs();
}
returnretVal;
}
staticintcountLegs1(List
intretVal=0;
for(Animalanimal:animals)
{
retVal+=egs();
}
returnretVal;
}
publicstaticvoidmain(String[]args){
List
//不会报错
countLegs(dogs);
//报错
countLegs1(dogs);
}
当调⽤countLegs1时,就会飘红,提⽰的错误信息如下:
所以,对于不确定或者不关⼼实际要操作的类型,可以使⽤⽆限制通配符(尖括号⾥⼀个问号,即<?>),表⽰可以持有任何类型。像
countLegs⽅法中,限定了上届,但是不关⼼具体类型是什么,所以对于传⼊的Animal的所有⼦类都可以⽀持,并且不会报错。⽽
countLegs1就不⾏。
上界通配符<?extendsE>
上届:⽤extends关键字声明,表⽰参数化的类型可能是所指定的类型,或者是此类型的⼦类。
在类型参数中使⽤extends表⽰这个泛型中的参数必须是E或者E的⼦类,这样有两个好处:
如果传⼊的类型不是E或者E的⼦类,编译不成功
泛型中可以使⽤E的⽅法,要不然还得强转成E才能使⽤
private
Eresult=arg2;
eTo(arg1);
//.....
returnresult;
}
类型参数列表中如果有多个类型参数上限,⽤逗号分开
下界通配符<?superE>
下界:⽤super进⾏声明,表⽰参数化的类型可能是所指定的类型,或者是此类型的⽗类型,直⾄Object
在类型参数中使⽤super表⽰这个泛型中的参数必须是E或者E的⽗类。
private
for(Tt:src){
(t);
}
}
publicstaticvoidmain(String[]args)臂bei组词 {
List
List
newTest3().填组词语 test(animals,dogs);
}
//Dog是Animal的⼦类
classDogextendsAnimal{
}
dst类型“⼤于等于”src的类型,这⾥的“⼤于等于”是指dst表⽰的范围⽐src要⼤,因此装得下dst的容器也就能装src。
和T的区别
和T都表⽰不确定的类型,区别在于我们可以对T进⾏操作,但是对不⾏,⽐如如下这种:
//可以
Tt=operate();
//不可以
car=operate();
简单总结下:
T是⼀个确定的类型,通常⽤于泛型类和泛型⽅法的定义,?是⼀个不确定的类型,通常⽤于泛型⽅法的调⽤代码和形参,不能⽤于定义
类和泛型⽅法。
区别1:通过T来确保泛型参数的⼀致性
//通过T来确保泛型参数的⼀致性
public
test(List
//通配符是不确定的,所以这个⽅法不能保证两个List具有相同的元素类型
publicvoid
test(List<?extendsNumber>dest,List<?extendsNumber>src)
像下⾯的代码中,约定的T是Number的⼦类才可以,但是申明时是⽤的String,所以就会飘红报错。
不能保证两个List具有相同的元素类型的情况
GlmapperGeneric
List
List
n(dest,src);
上⾯的代码在编译器并不会报错,但是当进⼊到testNon⽅法内部操作时(⽐如赋值),对于dest和src⽽⾔,就还是需要进⾏类型转
换。
区别2:类型参数可以多重限定⽽通配符不⾏
使⽤&符号设定多重边界(MultiBounds),指定瑾年绝恋醉流苏 泛型类型T必须是MultiLimitInterfaceA和MultiLimitInterfaceB的共有⼦类型,此
时变量t就具有了所有限定的⽅法和属性。对于通配符来说,因为它不是⼀个确定的类型,所以不能进⾏多重限定。
区别3:通配符可以使⽤超类限定⽽类型参数不⾏
类型参数T只具有⼀种类型限定⽅式:
TextendsA
但是通配符?可以进⾏两种限定:
extendsA
superA
Class
前⾯介绍了?和T的区别,那么对于,Class
最常见的是在反寸草春晖 射场景下的使⽤,这⾥以⽤⼀段发射的代码来说明下。
//通过反射的⽅式⽣成multiLimit
//对象,这⾥⽐较明显的是,我们需要使⽤强制类型转换
MultiLimitmultiLimit=(MultiLimit)
e(\"imit\").newInstance();
对于上述代码,在运⾏期,如果反射的类型不是MultiLimit类,那么⼀定会报astExceptio鹧鸪茶的功能和作用 n错误。
对于这种情况,则可以使⽤下⾯的代码来代替,使得在在编译期就能直接检查到类型的问题:
Class
如,我们可以这样做申明:
//可以
publicClass<?>clazz;
//不可以,因为T需要指定类型
publicClass
所以当不知道定声明什么类型的Class的时候可以定义⼀个Class<?>。
那如果也想publicClass
publicclassTest3
publicClass<?>clazz;
//不会报错
publicClass
⼩结
本⽂零碎整理了下JAVA泛型中的⼀些点,不是很全,仅供参考。如果⽂中有不当的地⽅,欢迎指正。
⼲货分享
最近将个⼈学习笔记整理成册,使⽤PDF分享。关注我,回复如下代码,即可获得百度盘地址,⽆套路领取!
001:《Java并发与⾼并发解决⽅案》学习笔记;002:《深⼊JVM内核——原理、诊断与优化》学习笔记;003:《Java⾯
试宝典》004:《Docker开源书》005:《Kubernetes开源书》006:《DDD速成(领域驱动设计速成)》007:全部
008:徐志摩的诗集有哪些 加技术群讨论
加个关注不迷路
喜欢就点个\"在看\"呗^_^
更多推荐
dest是什么意思t在线翻译读音例句
发布评论