簡體   English   中英

Java:在方法返回中使用泛型,它與泛型類參數不同

[英]Java: use generics in method return that differs from generic class parameter


    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中刪除泛化(<E>) - 它可以工作。

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


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

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

    Foo foo = new SomeClass();

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

為什么會這樣? 我在哪里可以閱讀它? 什么是最好的解決方案? 謝謝。

解決方案不是讓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中原始類型行為的任何解釋,但第4.8節確實包含此警告:

原始類型的使用僅允許作為遺留代碼兼容性的讓步。 強烈建議不要在將通用性引入Java編程語言之后編寫的代碼中使用原始類型。 未來版本的Java編程語言可能會禁止使用原始類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM