我試圖通過Java的泛型類型推斷
Map<String, Map<String, List<TranslationImport>>> variable
超類的構造函數,它預計:
Map<String, Map<String, List>>
我試圖改變父類的構造函數期待
Map<String, Map<String, List<?>>>
和
Map<String, Map<String, ? extends List>>
無濟於事。
我試圖通過Java的泛型類型推斷
Map<String, Map<String, List<TranslationImport>>> variable
超類的構造函數,它預計:
Map<String, Map<String, List>>
我試圖改變父類的構造函數期待
Map<String, Map<String, List<?>>>
和
Map<String, Map<String, ? extends List>>
無濟於事。
如果我理解正確,可以更改超類的構造函數簽名;你只需要一個接受List
元素類型的任意值的東西?
那應該是Map<String, ? extends Map<String, ? extends List<?>>>
。
也許這將 「幫助」 痘痘
static void test(Map<String, Map<String, List>> m) {
System.out.println(m);
}
public static void main(String[] args) {
Map<String, Map<String, List<TranslationImport>>> variable = new HashMap<String, Map<String, List<TranslationImport>>>();
Map<String, Map<String, List>> m2=(Map)variable;
test(m2);
}
問題是,捕捉轉換沒有遞歸應用: '?'
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.10
所以嵌套在<>是捕捉轉換
一種方式忽視使你的代碼工作(雖然沒有完全從視圖獲得來自仿製藥的任何值的點滿意)會做這樣的事情:
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
public class Foo extends FooParent {
Foo(Map<String, Map<String, List<TranslationImport>>> variable) {
super(variable);
System.out.println("ok");
}
public static void main(String[] args) {
Map<String, Map<String, List<TranslationImport>>> var =
new HashMap<String, Map<String, List<TranslationImport>>>();
Foo foo = new Foo(var);
}
}
class FooParent {
FooParent(Map<String, ?> variable) {
System.out.println("FooParent constructor");
}
}
class TranslationImport {
}
沒有Java 7,請:) – cbaby 2012-07-11 17:36:52
如果試試這個:Map>> –
Razvan
2012-07-11 17:39:34
修改超類以正確使用泛型! – 2012-07-11 17:41:21