我有一个简单的类,在下面编译时,它会正确地自动装箱整数,但是,对于我的布尔值,它无法这样做,它坚持我应该将参数更改为布尔值。我使用的是JDK1.8,否则编译器会抱怨整数转换。我看不出我做错了什么?所有包装器类都可以开箱即用,或者我是这么想的?
public class MsgLog<Boolean,String> {
private boolean sentOk ;
private Integer id ;
private int id2 ;
public boolean isSentOk() {
return sentOk;
}
public String getTheMsg() {
return theMsg;
}
private String theMsg ;
private MsgLog(Boolean sentOkp, String theMsg)
{
this.sentOk = sentOkp ; // compile error - autoboxing not working
this.theMsg = theMsg ;
this.id = 2; // autoboxing working
this.id2 = (new Integer(7)) ; // autoboxing working the other way around as well
}
}
自动装箱不是一个双向过程吗?
Compile error on jdk 8 (javac 1.8.0_25)
Multiple markers at this line
- Duplicate type parameter String
- The type parameter String is hiding the type String
- The type parameter Boolean is hiding the type
Boolean
您的问题是第一行:
public class MsgLog<Boolean,String>
您正在声明名为“Boolean”和“String”的类型参数。这些是对实际的布尔类型
和字符串
类型的阴影。在我看来,这个类甚至不需要类型参数;把它们取下来。如果确实要保留它们,则应重命名它们以避免隐藏现有类型。
从语义上来说,你发布的代码相当于(为了简洁起见,有些代码被剪掉了):
public class MsgLog<T,U> {
private boolean sentOk ;
private U theMsg ;
private MsgLog(T sentOkp, U theMsg)
{
this.sentOk = sentOkp ; // compile error - assignment to incompatible type
this.theMsg = theMsg ;
}
}
问题内容: 为什么会抛出 虽然这不是 解决方案是通过替换false方式Boolean.FALSE来避免null被取消装箱-这boolean是不可能的。但这不是问题。问题是为什么?JLS中是否有任何引用可以证实这种行为,尤其是第二种情况? 问题答案: 别在于方法的显式类型returnsNull()会在编译时影响表达式的静态类型: 参见Java语言规范,第15.25节“ 条件运算符?”。: 对于E1,
本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double
问题内容: 如果我错了,请纠正我。是Boxing + Varargs优于Boxing + Widening吗? 我在网站上发现了另一种方式。 问题答案: JLS#15.2.2中定义了几种可以合格时调用的方法: 第一阶段(第15.12.2.2节)执行重载解析,不允许装箱或拆箱转换,也不允许使用可变Arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第二阶段。 第二阶段(第15.12.
请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护了到之间的值的内部缓存(另请参阅TheLostMind的注释)。这就是为什么我在示例中使用的原因,也是为什么我特别询问取消装箱/装箱而不是比较结果的原因。
问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使