2012-07-11 150 views
4

我試圖通過Java的泛型類型推斷

Map<String, Map<String, List<TranslationImport>>> variable

超類的構造函數,它預計:

Map<String, Map<String, List>> 

我試圖改變父類的構造函數期待

Map<String, Map<String, List<?>>> 

Map<String, Map<String, ? extends List>> 

無濟於事。

+1

沒有Java 7,請:) – cbaby 2012-07-11 17:36:52

+0

如果試試這個:Map >> – Razvan 2012-07-11 17:39:34

+4

修改超類以正確使用泛型! – 2012-07-11 17:41:21

回答

5

如果我理解正確,可以更改超類的構造函數簽名;你只需要一個接受List元素類型的任意值的東西?

那應該是Map<String, ? extends Map<String, ? extends List<?>>>

1

也許這將 「幫助」 痘痘

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); 
} 
0

問題是,捕捉轉換沒有遞歸應用: '?'

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 { 
}