![](/img/trans.png)
[英]Java Generics: Use generic class as type parameter of another generic class
[英]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.