例如要创建一个字符串的ArrayList,我们必须做类似的事情Listlist=newArrayList();而它应该能够推断构造函数的参数类型,以便我们只需要键入Listlist=newArrayList();为什么不能像推断泛型方法的类型参数那样推断类型。 最佳答案 这是Java7的改进,也称为菱形运算符。语法将是:Liststrings=newArrayList();官方提案,acceptedforinclusioninProjectCoin是ImprovedTypeInferenceforGenericInstanceCre
考虑以下程序:publicclassGenericTypeInference{publicstaticvoidmain(String[]args){print(newSillyGenericWrapper().get());}privatestaticvoidprint(Objectobject){System.out.println("Object");}privatestaticvoidprint(Stringstring){System.out.println("String");}publicstaticclassSillyGenericWrapper{publicTget()
我正在做一个项目,我必须在其中否定PPM文件(图像)的像素。我这样实现了否定函数:publicPPMImagenegate(){RGB[]negated=newRGB[pixels.length];System.arraycopy(pixels,0,negated,0,pixels.length);RGB[]negatedArr=Arrays.stream(negated).parallel().map(rgb->rgb.neg(maxColorVal)).toArray(size->newRGB[size]);returnnewPPMImage(width,height,maxCol
我认为这可能与WhydoesagenericcastofaListtoListsucceedonSunJDK6butfailtocompileonOracleJDK7?有关如果我们采用以下类,它们可以在JDK6下正常编译:publicfinalclassFoo{privatefinalVvalue;privateFoo(finalVvalue){this.value=value;}publicstaticFooof(finalRvalue){returnnewFoo(value);}}finalclassTester{@Test(groups="unit")publicstaticvo
是否有可能让javac输出有关它为方法调用推断的类型的信息?例如,我想知道在bar的invocation中,对于形式类型T的推断是什么。privatestaticvoidbar(){...}publicvoidfoo(){bar();}我正在探索javac-Xprint和friend,但找不到任何公开这种细节的东西。编辑示例。我最初不想提出这个问题,因为它会使答案复杂化。我主要对从javac中获取调试信息感兴趣。无论如何,这是一个激励人心的例子:publicclassScratch{privatestaticvoidsneakyThrow(Throwablet)throwsT{thro
我正在阅读OCPJavaSE7,certificationguidefromMalaGupta.在第297页,以下代码片段importjava.util.HashMap;importjava.util.Map;publicclassTestGenericTypeInference{MapsalaryMap=newHashMap();MapcopySalaryMap=newHashMap(salaryMap);}正在使用java8进行编译,但使用java7时编译器会报错:TestGenericTypeInference.java:8:error:incompatibletypes:Has
考虑以下代码:classTest{voidaccept(Consumerc){}staticvoidconsumer(Integeri){}voidfoo(){accept(this::consumer);//Themethodaccept(Consumer)inthetypeTestisnotapplicableforthearguments(this::consumer)accept(Test::consumer);//Valid}}前几天我无意中以非静态方式调用静态方法时遇到了这个问题。我知道您不应该以非静态方式调用静态方法,但我仍然想知道,为什么在这种情况下不能推断类型?
我有一个重载方法,它采用两个不同的功能接口(interface)作为参数(Runnble和Supplier)。System.out.println显然只兼容Runnable,因为它是一个void方法。然而编译器仍然声称调用是不明确的。这怎么可能?importjava.util.function.Supplier;publicclassGenericLambdas{publicstaticvoidmain(String[]args){wrap(System.out::println);//Compilererrorherewrap(()->{});//Noerrorwrap(System
代码(缩短了实际代码以解释问题)。importjava.util.Map;importjava.util.HashMap;publicclassTypeReferenceTest{publicstaticclassModel{publicvoidsetAbc(Abcabc){}}publicstaticclassAbc{publicAbc(Tval){}}publicstaticvoidmain(String[]args){MapattrMap=newHashMap();attrMap.put("key",0);Modelm=newModel();m.setAbc(newAbc(get
我目前正在编写Java编译器并已实现第15.12.2.7节。JLS7(http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7)的一部分,规范中最烦人的部分之一。我仍然有一个问题,因为规范似乎不明确或模棱两可。我的问题是这一行:lcta(U)=?如果U的上限是Object,否则?扩展lub(U,Object)U是一个任意类型的表达式。类型表达式的上限是多少?另外,为什么lcta总是通配符?规范定义CandidateInvocation(G)=lci(Inv(G))。现在,例如,考虑Inv(G)=