java定义受限制的类型参数操作
有时您可能想限制可以在参数化类型中用作类型参数的类型。例如,对数字进行操作的方法可能只希望接受Number或其子类的实例。这就是有界类型参数的用途。
受限制参数类型的方法示例
要声明有界类型参数,请列出类型参数的名称,后跟extends关键字,然后是其上限,在本例中为Number
请注意,在这种情况下,extends通常用于表示“扩展”(如在类中)或“实现”(如在接口中)。
packagegenerics; /** *定义受限制的方法 * *@authorpsdxdgK1DT * */ publicclassBox{ privateTt; publicvoidset(Tt){ this.t=t; } publicTget(){ returnt; } /** *通过修改我们的通用泛型方法以包含此有界类型参数,现在编译将失败,因为我们对inspect的调用仍包含String: *Bymodifyingourgenericmethodtoincludethisboundedtypeparameter *compilationwillnowfail,sinceourinvocationofinspectstillincludesaString: *inspect:单词:检查 *@param *@paramu */ public voidinspect(Uu){ System.out.println("T:"+t.getClass().getName()); System.out.println("U:"+u.getClass().getName()); } publicstaticvoidmain(String[]args){ Box integerBox=newBox (); integerBox.set(newInteger("sometext")); integerBox.inspect("sometest");这里会出现预编译错误 integerBox.inspect(10); } }
在显示器上会出现红色的波浪线表示编译错误
如果强行编译则会报错:
programrunresult:
Exceptioninthread“main”java.lang.Error:Unresolvedcompilationproblem:Themethodinspect(U)inthetypeBoxisnotapplicableforthearguments(String)
atgenerics.Box.main(Box.java:36)
译文:
未解决的编译错误
Box类的inspect(U)方法不可应用于(String)类型参数\
使用受限类型参的类可调用受限边界方法
除了限制可用于实例化泛型类型的类型外,有界类型参数还允许您调用在边界中定义的方法:
//使用受限类型参数的类 publicclassNaturalNumber{ privateTn; publicNaturalNumber(Tn){this.n=n;} publicbooleanisEven(){ returnn.intValue()%2==0; } //... }
isEven方法通过n调用Integer类中定义的intValue方法。
多重受限边界(MultipleBounds)
Theprecedingexampleillustratestheuseofatypeparameterwithasinglebound,butatypeparametercanhavemultiplebounds:
Atypevariablewithmultipleboundsisasubtypeofallthetypeslistedinthebound.Ifoneoftheboundsisaclass,itmustbespecifiedfirst.Forexample: ClassA{/*…/}interfaceB{/…/}interfaceC{/…*/}
classD
{/*…*/}IfboundAisnotspecifiedfirst,yougetacompile-timeerror: classD
{/*…*/}//compile-timeerror
泛型算法
有界类型参数是实现泛型算法的关键。考虑下面的方法,该方法计算数组T[]中大于指定元素elem的元素数。
publicstaticintcountGreaterThan(T[]anArray,Telem){ intcount=0; for(Te:anArray) if(e>elem)//compilererror ++count; returncount; } Theimplementationofthemethodisstraightforward, butitdoesnotcompilebecausethegreaterthanoperator(>)appliesonlytoprimitivetypes suchasshort,int,double,long,float,byte,andchar. Youcannotusethe>operatortocompareobjects.Tofixtheproblem,useatypeparameter boundedbytheComparable interface: publicinterfaceComparable { publicintcompareTo(To); } Theresultingcodewillbe: publicstatic >intcountGreaterThan(T[]anArray,Telem){ intcount=0; for(Te:anArray) //因为这里的T是受限制的类型参数,实现了Comparable接口,于是可以使用接口的方法compareTo if(e.compareTo(elem)>0) ++count; returncount; }
以上这篇java定义受限制的类型参数操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。