草庐IT

Generics

全部标签

java - Java 的类型参数通配符到底是什么意思? Foo 和 Foo<?> 之间的真正区别是什么?

对于通用接口(interface):publicinterfaceFoo{voidf(Tt);}两个字段的区别:publicclassBar{Foofoo1;Foofoo2;}是foo2吗是一个通用类型并且foo不是。自?是一个通配符(我认为这意味着任何类型)并且每种类型都是Object的子类型,那么我希望Foo和Foo在语义和句法上等价。但是,请检查以下内容:publicclassPuzzler{voidf(){Integeri=null;Foofoo1=null;foo1.foo(i);//ERRORFoofoo2=null;foo2.foo(i);//OKAYFoofoo3=nu

java - 实例化一个类的对象,该类是通过泛型给出的

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:CreateinstanceofgenerictypeinJava?我有一些代码:publicclassfoo{publicvoidbar(){Kcheese=newK();//stuff}}这不会编译,Intellij的linter告诉我不能直接实例化类型参数“K”。我将如何实例化K的新副本。

java - 意外的未经检查的转换警告

谁能解释为什么在y分配行上有一个未类型化的转换警告?请注意,x或z分配没有警告。publicclassEntity{@SuppressWarnings("unchecked")publicEntitytyped(Classtype){return(Entity)this;}@SuppressWarnings("unchecked")publicstaticEntitytyped(Entityentity,Classtype){return(Entity)entity;}publicstaticvoidmain(finalString[]args){finalEntitya=newEnt

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

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

java - 如何解释这种看似不一致的 Java 可变参数行为?

如果我写Java方法publicstaticvoidf(int...x){for(inta:x){System.out.println(a);}}然后我可以通过调用这个方法f(1,2,3);还有f(newint[]{1,2,3});并且两个调用的处理方式完全相同。然而,这两个电话Arrays.asList(1,2,3)//(a)producesathree-elementIntegerlist和Arrays.asList(newint[]{1,2,3})//(b)producesaone-elementlistofIntegerarrays不一样对待。Thesectiononevalu

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 - 调试内部编译器错误 (Java) 以查找有问题的源代码

由于JDK错误,我设法编写了一些在使用JDK1.8.0_131编译期间导致错误的代码。我可以仅用几行代码重现该问题,但我找不到在我的项目中哪里使用了导致错误的模式。我的目标是找出我项目中的哪些代码导致了这个错误,并应用解决方法。发布与复制JDK-8074381bugreport中概述了该问题并且只需几行代码即可复制。publicclassTest{publicinterfaceFooextendsFunction{Stringapply(Numberp);}privatestaticfinalFooCRASH=p->"Thiswillcrashjavac1.8.0_131";}当使用非

c# - C# 4.0 中的协变和逆变推理

当我们在C#4.0中定义接口(interface)时,我们可以将每个通用参数标记为in或out。如果我们尝试将通用参数设置为out并且这会导致问题,编译器会引发错误,不允许我们这样做。问题:如果编译器有办法推断协变(out)和逆变(in),为什么我们必须这样标记接口(interface)?仅仅让我们像往常一样定义接口(interface),并且当我们尝试在客户端代码中使用它们时,如果我们尝试以不安全的方式使用它们会引发错误,这还不够吗?示例:interfaceMyInterface{Tabracadabra();}//worksOKinterfaceMyInterface2{Tabra

java - 这里如何推断通用类型?

publicstaticvoidmain(String[]args){Map>>map=getHashMap();}staticMapgetHashMap(){returnnewHashMap();}我在googleguava中看到了类似的代码(作为工厂方法)用于创建Hashmap的实例而没有提及泛型类型。我不明白上面的程序是如何推断出泛型的。我的意思是函数getHashMap怎么能了解map的类型,因为我没有将任何类型信息传递给函数。 最佳答案 getHashMap函数不必推断类型。在调用站点,Java语言规范要求javac推断类