【问题标题】:Assignments and Generics compilation issue作业和泛型编译问题
【发布时间】:2017-06-28 10:46:25
【问题描述】:

在学习 Generics 时,我发现第一个方法 m1 编译成功,而第二个方法 m2 编译失败并出现以下错误消息:

类型不匹配:无法从 int 转换为 Long

   class Test1 {

    <T extends Integer> void m1(T arg) {
        long i = arg;
    }

    void m2(int i) {
        Long l = i;// Compilation fails
    }
}

谁能帮我理解这种行为。

【问题讨论】:

标签: java generics


【解决方案1】:

这是无效的

Long l = i;

因为 i 是原始整数,而 l 是 long 类型的对象,所以“转换”不会自动发生

你可以得到那个整数的值

Long l = Long.valueOf(i); 

请注意,与拳击促进原语相关的另一个选项可以是:

void m2(int i) {
    long x = i;
    Long l = x;
}

【讨论】:

    【解决方案2】:

    您正在尝试利用自动装箱功能将原始值分配给对象类型。但如果原始类型和包装对象类型不是同一类型,则它不起作用。例如,如果您像这样更改m2() 方法,它应该可以工作:

    void m2(long i) {
        Long l = i;
    }
    

    或者您可以使用Long 包装类中的valueOf() 方法,正如答案中已经说过的那样:

    void m2(int i) {
            Long l = Long.valueOf(i);
    }
    

    但我建议尽可能避免自动装箱。这是不好的做法。你可以在这里阅读文章,为什么不好:https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/

    最后一点,你应该删除类型参数TInteger类的扩展,因为Integer是最终类型,不能扩展。然后你的m1() 方法看起来像这样:

    void m1(Integer arg) {
            long i = arg;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多