Java:在方法返回中使用泛型,它与泛型类参数不同

时间:2010-06-28 12:36:08

标签: java generics


    class SomeClass<E> {
       Map<String, String> someMethod();
    }

使用


    SomeClass a = new SomeClass();
    a.someMethod().get("foo") // returns object, not string!

    //This code would not even compile
    String s = a.someMethod().get("foo");

但如果我从SomeClass中删除泛化(&lt; E&gt;) - 它可以工作。

如果我将此方法提取到接口并在声明中使用接口,它也可以工作:


    interface Foo {
     Map<String, String> someMethod();
    }

    class SomeClass implements Foo {
    //.....
    }

    Foo foo = new SomeClass();

    String s = foo.someMethod().getString("A");//it works

为什么会这样?我在哪里可以阅读它?什么是最好的解决方案? 感谢。

1 个答案:

答案 0 :(得分:10)

解决方案不是让SomeClass非泛型 - 这是为了避免使用原始类型。例如,这很好用:

import java.util.*;

class SomeClass<E> {
   Map<String, String> someMethod() {
      return null;
   }
}

public class Test {
    public static void main(String[] args) {
        SomeClass<Integer> a = new SomeClass<Integer>();
        String value = a.someMethod().get("foo");
    }
}

不可否认,如果您使用原始类型,该方法有效地应用了类型擦除,这有点奇怪 - 但您基本上应该避免这样做。

我目前无法找到有关JLS中原始类型行为的任何解释,但section 4.8确实包含此警告:

  

原始类型的使用仅允许作为遗留代码兼容性的让步。该   在将通用性引入Java之后编写的代码中使用原始类型   强烈建议不要使用编程语言。未来的版本可能是   Java编程语言将禁止使用原始类型。