【问题标题】:Java generic type inferenceJava 泛型类型推断
【发布时间】:2012-07-11 17:36:07
【问题描述】:

我正在尝试通过

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

到期望的超类的构造函数:

Map<String, Map<String, List>>  

我尝试将父类的构造函数更改为期望

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

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

无济于事。

【问题讨论】:

  • 如果你试试这个:Map>>
  • 修改超类以正确使用泛型!
  • @LouisWasserman 如果您指的是绑定 List 到特定类型,那不是一个选项。

标签: java generics wildcard type-inference


【解决方案1】:

如果我理解正确,您可以更改超类构造函数签名;您只需要接受List 元素类型的任意值的东西吗?

应该是Map&lt;String, ? extends Map&lt;String, ? extends List&lt;?&gt;&gt;&gt;

【讨论】:

    【解决方案2】:

    也许这会“帮助”一点

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

    【讨论】:

      【解决方案3】:

      问题是捕获转换没有递归应用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        相关资源
        最近更新 更多