草庐IT

java - 如果在将Optional <Object>作为参数时,编译器将解析为null,那是一个好主意吗?

这显然非常有用,以至于我开始认为我缺少避免这种情况的理由,因为我确信Oracle会做到这一点。对我来说,这将是Optional上最有值(value)的功能。publicclassTestOptionals{publicstaticvoidmain(String[]args){test(null);}publicstaticvoidtest(Optionaloptional){System.out.println(optional.orElse(newDefaultObject()));}}(这将引发NullPointerException)如果没有该功能,则使用Optional作为参数

java - Java 中的装箱和自动装箱有什么区别?

Java中的装箱和自动装箱有什么区别?一些Java认证书籍使用了两个这样的术语。他们指的是拳击吗? 最佳答案 装箱是机制(即从int到Integer);自动装箱是编译器的一项功能,它可以为您生成装箱代码。例如,如果您编写代码://listisaListlist.add(3);然后编译器会自动为你生成装箱代码;代码中的“最终结果”将是:list.add(Integer.valueOf(3));关于为什么Integer.valueOf()而不是newInteger()的说明:基本上,因为JLS是这样说的:)引用section5.1.7:

java - 数字文字的自动装箱 : wrapper initialization vs passing method arguments inconsistency

请考虑两种情况://1Shorts=10;//obviouslycompiles//2takeShort(10);//error-intisnotapplicable//where:staticvoidtakeShort(Shorts){}我假设情况1被编译器更改为:short_temp_s=10;Shorts=Short.valueOf(_temp_s);您能否解释一下编译器在情况2中试图做什么,所以它无法编译?如果它不像案例1那样尝试应用自动装箱,那么为什么?编辑johnchen902答案中对JSL的引用解释了编译器的行为。仍然不完全清楚为什么JLS不支持方法调用转换的“缩小原始转

java - 如何取消装箱 javascript (nashorn) 在 Java 对象中返回的值?

我有以下程序,它在Java(nashorn)中执行Javascript。Javascript代码正在返回一个对象。publicObjectexecute(){ScriptEngineManagersem=newScriptEngineManager();ScriptEnginee=sem.getEngineByName("nashorn");Invocableinvocable=(Invocable)e;ScriptEngineFactoryf=e.getFactory();Objectresult;try{Stringstatement="functionfetch(value,co

java 。为什么它对英语和斯拉夫字符的处理方式不同?

在使用Java时,我发现了一件对我来说很奇怪的事情。也许这是一件很普通的事情,但我不明白为什么会这样。我有这样的代码:Characterx='B';Objecto=x;System.out.println(o=='B');它工作正常,输出为“true”。然后我把英语B改成斯拉夫语B(Б):Characterx='Б';Objecto=x;System.out.println(o=='Б');现在输出为“false”。怎么会?顺便说一句,如果我直接将x变量与'B'进行比较,输出仍然是“真”,但是当我通过对象进行比较时,它的工作方式有所不同。谁能解释一下这种行为?

Java - SAM类型优化

Aworkingdocument描述ProjectLambda的状态提到了所谓的SAM(单一抽象方法)类型。据我所知,当前的lambda提案不会影响运行时,只会影响编译器,因为它可以实现从lambda表达式到这些类型的自动转换。我认为在理想情况下,SAM类型的实例可以在内部由函数指针表示。因此JVM可以避免为这些实例分配内存。我想知道现代虚拟机是否能够提供这种优化。 最佳答案 @Tamás您可能应该阅读BrianGoetz的邮件列表帖子:http://mail.openjdk.java.net/pipermail/lambda-de

java - 用 Arrays.asList() 装箱

在下面的例子中:classZiggyTest2{publicstaticvoidmain(String[]args){int[]a={1,2,3,4,7};Listli2=newArrayList();li2=Arrays.asList(a);}}编译器提示int[]和java.lang.Integer不兼容。即found:java.util.Listrequired:java.util.Listli2=Arrays.asList(a);^如果我更改List定义以删除通用类型,它工作正常。Listli2=newArrayList();编译器不应该将整数自动装箱为整数吗?我如何创建Lis

java - Java 中的 Double 与 doubleValue

如果一个方法返回一个Double,为什么我们要在它上面调用方法“doubleValue”?它已经返回一个double并且在计算中,似乎评估正确。 最佳答案 在Java1.5之前,Java中不存在自动装箱(和拆箱)功能。因此,您需要它来从Double中提取底层原语。如果您不熟悉自动装箱,可以在此处阅读更多内容。http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html 关于java-Java中的Double

java - 使用 Boolean.valueOf() 方法 vs(或 Java 1.5 自动装箱)创建 boolean 对象

Boolean.valueOf()和Java1.5自动装箱从booleans创建Boolean哪个更好>为什么? 最佳答案 boolean的自动装箱被编译器透明地转换为Boolean.valueOf():booleanb=true;Booleanbb=b;翻译成:iconst_1istore_1//b=1(true)iload_1//binvokestatic#2;//Methodjava/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;astore_2//bb=Boolean.valueOf(

java - Java 中不必要的拆箱 - 如何重构代码?

我有以下Java8代码(为演示而简化):publicDoublefooBar(inta){returnDouble.valueOf(a);}现在IntelliJIDEA告诉我在返回语句中有不必要的装箱。如果a是double类型,我会理解这个问题,但是对于int我觉得我需要装箱才能转换为双。是否有重构这段我目前看不到的代码的好方法,或者此时来自IntelliJIDEA的错误消息根本不是最佳的?感谢帮助 最佳答案 如果您使用alt-enter使用建议的分辨率“删除装箱”,结果是这样的:publicDoublefooBar(inta){r