【问题标题】:java generic method return type [duplicate]java泛型方法返回类型[重复]
【发布时间】:2015-05-16 23:51:56
【问题描述】:

在下面的代码中,方法“bla()”返回的是Object的ArrayList而不是String,这是怎么回事?

public class MyClass<T>{   
        public ArrayList<String> bla(){
            return new ArrayList<String>();
        }

        public static void foo(){
           new MyClass().bla().add([here auto complete says "Object" not "String"])
        }
    }

【问题讨论】:

  • 当我将该代码粘贴到 IntelliJ 时,它指出方法“添加”需要一个字符串
  • edit: public class MyClass 现在需要 Object...
  • 这很奇怪,甚至更奇怪,如果您将行更改为 new MyClass&lt;&gt;().bla().add(); 它会将 String 作为参数
  • 谢谢,没想到!正是我需要的
  • 很高兴能帮上忙,但我想知道它为什么会这样!

标签: java oop generics arraylist


【解决方案1】:

因为你还没有参数化这个新的实例创建表达式

new MyClass()

结果值是原始类型MyClassJava Language Specification states

构造函数的类型(第 8.8 节)、实例方法(第 8.4 节、第 9.4 节)或 未从其继承的原始类型 C 的非静态字段(第 8.3 节) 超类或超接口是对应于的原始类型 在对应于C 的泛型声明中擦除其类型。

那是

public ArrayList<String> bla(){
    return new ArrayList<String>();
}

现在被视为

public ArrayList bla() {
    return new ArrayList<String>();
}

返回类型本身就是原始类型ArrayList,其add方法的类型也成为其擦除的原始类型,即。 Object 来自泛型变量 T

显然,您仍然可以将String 添加到需要Object 的方法中,但是对于拥有MyClass 实例的正确参数化视图的任何人来说,类型安全都会被破坏。

阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多