幡然的英文译语怎么说-进击的巨人周几更新


2023年刹的多音字组词 4月7日发(作者:中韩文在线翻译)

泛型中的T、E、K、V、?等等,究竟是啥?

点击下⽅“IT牧场”,选择“设为星标”

来源:/post/

5d5789d26f荔枝的功效与作用 b9a06ad0056bd9

前⾔

泛型带来的好处

泛型中通配符

常⽤的T,E,K,V,?

⽆界通配符

上界通配符<?extendsE>

下界通配符<?superE>

和T的区别

Class和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(){

GlmapperGenericglmapperGeneric=newGlmapperGeneric();

(\"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和⼏个⼦类,如狗、猫等,现在我需要⼀个动物的列表,我的第⼀个想法是像这样的:

ListlistAnimals

但是⽼板的想法确实这样的:

List<?extendsAnimal>listAnimals

为什么要使⽤通配符⽽不是简单的泛型呢?通配符其实在声明局部变量时是没有什么意义的,但是当你为⼀个⽅法声明⼀个参数时,它是⾮

常重要的。

staticintcountLegs(List<?extendsAnimal>animals){

intretVal=0;

for(Animalanimal:animals)

{

retVal+=egs();

}

returnretVal;

}

staticintcountLegs1(Listanimals){

intretVal=0;

for(Animalanimal:animals)

{

retVal+=egs();

}

returnretVal;

}

publicstaticvoidmain(String[]args){

Listdogs=newArrayList<>();

//不会报错

countLegs(dogs);

//报错

countLegs1(dogs);

}

当调⽤countLegs1时,就会飘红,提⽰的错误信息如下:

所以,对于不确定或者不关⼼实际要操作的类型,可以使⽤⽆限制通配符(尖括号⾥⼀个问号,即<?>),表⽰可以持有任何类型。像

countLegs⽅法中,限定了上届,但是不关⼼具体类型是什么,所以对于传⼊的Animal的所有⼦类都可以⽀持,并且不会报错。⽽

countLegs1就不⾏。

上界通配符<?extendsE>

上届:⽤extends关键字声明,表⽰参数化的类型可能是所指定的类型,或者是此类型的⼦类。

在类型参数中使⽤extends表⽰这个泛型中的参数必须是E或者E的⼦类,这样有两个好处:

如果传⼊的类型不是E或者E的⼦类,编译不成功

泛型中可以使⽤E的⽅法,要不然还得强转成E才能使⽤

privateEtest(Karg1,Earg2){

Eresult=arg2;

eTo(arg1);

//.....

returnresult;

}

类型参数列表中如果有多个类型参数上限,⽤逗号分开

下界通配符<?superE>

下界:⽤super进⾏声明,表⽰参数化的类型可能是所指定的类型,或者是此类型的⽗类型,直⾄Object

在类型参数中使⽤super表⽰这个泛型中的参数必须是E或者E的⽗类。

privatevoidtest(List<?superT>dst,Listsrc){

for(Tt:src){

(t);

}

}

publicstaticvoidmain(String[]args)臂bei组词 {

Listdogs=newArrayList<>();

Listanimals=newArrayList<>();

newTest3().填组词语 test(animals,dogs);

}

//Dog是Animal的⼦类

classDogextendsAnimal{

}

dst类型“⼤于等于”src的类型,这⾥的“⼤于等于”是指dst表⽰的范围⽐src要⼤,因此装得下dst的容器也就能装src。

和T的区别

和T都表⽰不确定的类型,区别在于我们可以对T进⾏操作,但是对不⾏,⽐如如下这种:

//可以

Tt=operate();

//不可以

car=operate();

简单总结下:

T是⼀个确定的类型,通常⽤于泛型类和泛型⽅法的定义,?是⼀个不确定的类型,通常⽤于泛型⽅法的调⽤代码和形参,不能⽤于定义

类和泛型⽅法。

区别1:通过T来确保泛型参数的⼀致性

//通过T来确保泛型参数的⼀致性

publicvoid

test(Listdest,Listsrc)

//通配符是不确定的,所以这个⽅法不能保证两个List具有相同的元素类型

publicvoid

test(List<?extendsNumber>dest,List<?extendsNumber>src)

像下⾯的代码中,约定的T是Number的⼦类才可以,但是申明时是⽤的String,所以就会飘红报错。

不能保证两个List具有相同的元素类型的情况

GlmapperGenericglmapperGeneric=newGlmapperGeneric<>();

Listdest=newArrayList<>();

Listsrc=newArrayList<>();

n(dest,src);

上⾯的代码在编译器并不会报错,但是当进⼊到testNon⽅法内部操作时(⽐如赋值),对于dest和src⽽⾔,就还是需要进⾏类型转

换。

区别2:类型参数可以多重限定⽽通配符不⾏

使⽤&符号设定多重边界(MultiBounds),指定瑾年绝恋醉流苏 泛型类型T必须是MultiLimitInterfaceA和MultiLimitInterfaceB的共有⼦类型,此

时变量t就具有了所有限定的⽅法和属性。对于通配符来说,因为它不是⼀个确定的类型,所以不能进⾏多重限定。

区别3:通配符可以使⽤超类限定⽽类型参数不⾏

类型参数T只具有⼀种类型限定⽅式:

TextendsA

但是通配符?可以进⾏两种限定:

extendsA

superA

Class和Class<?>区别

前⾯介绍了?和T的区别,那么对于,Class⼜有什么区别呢?Class和Class<?>

最常见的是在反寸草春晖 射场景下的使⽤,这⾥以⽤⼀段发射的代码来说明下。

//通过反射的⽅式⽣成multiLimit

//对象,这⾥⽐较明显的是,我们需要使⽤强制类型转换

MultiLimitmultiLimit=(MultiLimit)

e(\"imit\").newInstance();

对于上述代码,在运⾏期,如果反射的类型不是MultiLimit类,那么⼀定会报astExceptio鹧鸪茶的功能和作用 n错误。

对于这种情况,则可以使⽤下⾯的代码来代替,使得在在编译期就能直接检查到类型的问题:

Class在实例化的时候,T要替换成具体类。Class<?>它是个通配泛型,?可以代表任何类型,所以主要⽤于声明时的限制情况。⽐

如,我们可以这样做申明:

//可以

publicClass<?>clazz;

//不可以,因为T需要指定类型

publicClassclazzT;

所以当不知道定声明什么类型的Class的时候可以定义⼀个Class<?>。

那如果也想publicClassclazzT;这样的话,就必须让当前的类也指定T,

publicclassTest3{

publicClass<?>clazz;

//不会报错

publicClassclazzT;

⼩结

本⽂零碎整理了下JAVA泛型中的⼀些点,不是很全,仅供参考。如果⽂中有不当的地⽅,欢迎指正。

⼲货分享

最近将个⼈学习笔记整理成册,使⽤PDF分享。关注我,回复如下代码,即可获得百度盘地址,⽆套路领取!

001:《Java并发与⾼并发解决⽅案》学习笔记;002:《深⼊JVM内核——原理、诊断与优化》学习笔记;003:《Java⾯

试宝典》004:《Docker开源书》005:《Kubernetes开源书》006:《DDD速成(领域驱动设计速成)》007:全部

008:徐志摩的诗集有哪些 加技术群讨论

加个关注不迷路

喜欢就点个\"在看\"呗^_^

更多推荐

dest是什么意思t在线翻译读音例句