2012-07-11 153 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 { 
}