草庐IT

【JavaSE】初识泛型

全部标签

java - 如何从 Java 8 中的 getAnnotatedParameterTypes() 获取泛型类型信息?

似乎getAnnotatedParameterTypes()返回一个包含原始类型而非通用类型的AnnotatedType数组。例如:publicvoidgenericMethod(Tt){}@TestpublicvoidtestAnnotatedTypes()throwsReflectiveOperationException{Methodmethod=getClass().getMethod("genericMethod",Object.class);Typetype=method.getGenericParameterTypes()[0];assertTrue(typeinstan

java - 为什么在将原始类型分配给泛型类型时不会出现编译器错误?

我一直在查看OJCPA代码片段,我很困惑为什么编译器不会在以下代码中抛出错误。Listl=newArrayList();l.add("a");l.add("b");l.add(1);ListstrList=newArrayList();strList=l;//#1-Whydoestheassignmentcompile?for(Strings:strList){System.out.println(s);//#2-ItmakessensethatitthenthrowsaClassCastException}我认为编译器会将Listl视为原始类型,因为泛型是不变的,所以会产生编译器错误

java - 如何将泛型对象作为泛型参数传递给 java 中的其他方法?

我在使用泛型方法时遇到了麻烦编译类:publicclassSomething{publicstaticSomethingnewInstance(Classtype){};publicvoiddoSomething(Tinput){};}我的方法是:publicvoiddoOtherThing(Sinput){Somethingsmt=Something.newInstance(input.getClass());smt.doSomething(input);//Errorhere}编译时出错:nosuitablemethodfoundfordoSomething(T)Tcannotbe

java - 没有泛型的动态实例创建

我想了解为什么以下内容不起作用:publicclassHelloClass{privateclassMyClass{publicMyClass(){System.out.println("Ohheckthisisme!");}}publicObjectnewInstance(Objecto){try{//java.lang.InstantiationExceptionherereturno.getClass().newInstance();}catch(Exceptione){e.printStackTrace(System.out);returnnull;}}publicvoidru

java - 泛型类型推断失败?

例子A研究以下片段:publicclassExampleA{staticclassPair{}staticPairanyPair(){returnnull;}staticvoidprocess(Pairp1,Pairp2){return;}publicstaticvoidmain(String[]args){Pairp=anyPair();process(p,anyPair());//doesn'tcompile}}有人可以解释为什么类型推断适用于局部变量p的赋值,但不适用于process的第二个实际参数吗?例子B这可能更容易理解:publicclassExampleB{publics

java - 在接口(interface)扩展中指定泛型

当用另一个接口(interface)扩展一个接口(interface)时,我应该为泛型类型指定具体类型吗?我的意思是,如果我有一个接口(interface):publicinterfaceRepo{Collectionsearch(Stringparams);Tget(Stringid);}然后是一大堆特定的Repositories,比如ClientRepo、CustomerRepo等......在什么时候指定类型T是否合理扩展此接口(interface),例如:publicinterfaceClientRepoextendsRepo{}publicinterfaceCustomerR

java泛型通配符

我有一个关于在Java的泛型类型中使用通配符的问题:List之间的基本区别是什么?和List?我什么时候使用? 最佳答案 两个原因:为避免不必要的转换:对于这种情况,您必须使用T变体:publicTfirstOf(Listl){returnl.get(0);}使用?这将变成:publicSetfirstOf2(Listl){returnl.get(0);}...它不会向firstOf方法的调用者提供相同数量的信息。第一个版本允许调用者这样做:SubSetfirst=firstOf(listOfSubSet);而对于第二个版本,您被迫

java - 泛型 - (elements instanceof List<? extends Comparable>) 的合法替代品

我有一个唯一参数(Listelements)将元素设置为ListModel的方法,但我需要进行验证以查看通用类型是否实现了可比性,因为这样的事情:if(elementsinstanceofList)是非法的,我不知道如何进行正确的验证。更新我已经使用以下方法完成了此验证:(elements.size()>0&&elements.get(0)instanceofComparable)但我想知道是否有更清洁的解决方案,例如使用反射?提前致谢。 最佳答案 列表的通用类型是erasedatruntime.为此,您需要在方法签名中要求参数或单

java - 从 scala 调用重载的 java 泛型方法

我正在使用Mockito通过返回未参数化ArrayList的方法来模拟对象,但我不知道如何让它工作要模拟的方法签名publicjava.util.ArrayListgetX()测试代码varmockee=mock(classOf[Mockee])when(mockee.getX).thenReturn(Lists.newArrayList(x):ArrayList[_])这实际上在IntelliJ中编译得很好,但在运行时抛出:[error]....scala:89:overloadedmethodvaluethenReturnwithalternatives:[error](java.

java - Java 中的泛型方法和类型推断

给定以下不是很有用的代码:packagecom.something;importjava.util.ArrayList;importjava.util.Collection;//Notagenericclass!publicclassTest{publicvoidplain(Tparam1,Tparam2){}publicvoidfancy(Tparam1,Collectionparam2){}publicvoidtestMethod(){//Noerrorfancy("",newArrayList());//Compilererrorhere!fancy("",newArrayLis