【问题标题】:Autoboxing not working for Boolean自动装箱不适用于布尔值
【发布时间】:2014-06-18 00:10:42
【问题描述】:

我有一个简单的类,在它下面编译时自动装箱整数正确 但是,没有为我的布尔值做到这一点,它坚持我应该将参数更改为布尔值。我使用的是 jdk 1.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

【问题讨论】:

  • 您可能会考虑分享实际的编译器错误,而不是让我们猜测......
  • this.id = 2; 行中根本没有装箱,因此您的评论“自动装箱工作”不正确。

标签: java boolean autoboxing


【解决方案1】:

你的问题是第一行:

public class MsgLog<Boolean,String> 

您正在声明名为“Boolean”和“String”的类型参数。这些隐藏了实际的BooleanString 类型。据我所知,您甚至不需要此类的类型参数;只需删除它们。如果您确实想保留它们,则应重命名它们以避免影响现有类型。

从语义上讲,您发布的代码相当于(为简洁起见,有些代码被剪掉了):

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 ;
    }

}

【讨论】:

  • +1,特别是它们是 generic 类型参数,这可能有助于为 OP 澄清它。
  • @GriffeyDog 谢谢,但这些类型参数不是泛型(相反,它们是泛型类型的类型参数)!在这种情况下,术语“类型参数”是正确的。据我所知,语言规范甚至没有使用术语“通用类型参数”。参见例如docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.2
  • 我本可以使用更好的措辞。它们是泛型类的类型参数。
  • @davmac 即使他们正在遮蔽实际 - 所谓的覆盖(阴影)布尔值和导致布尔值的覆盖......两者都应该以相同的方式运行,即处于能够自动装箱??
  • @user1561783,没有。自动装箱不适用于某些任意类型参数,这就是您现在拥有的。例如。将示例中的“布尔”替换为“T”,在它出现的任何地方(包括方法签名中)。这在语义上是等价的。你还会期望它自动装箱/拆箱吗?无论如何,如果您从类中删除类型参数,您将看到它可以编译。这应该足够证明了。
猜你喜欢
  • 2011-04-22
  • 2018-02-22
  • 2011-01-17
  • 2019-06-06
  • 1970-01-01
  • 2016-11-13
  • 2016-10-23
  • 1970-01-01
  • 2021-10-16
相关资源
最近更新 更多