【问题标题】:Generic Type Mismatch泛型类型不匹配
【发布时间】:2016-03-23 15:07:21
【问题描述】:
class GenMethDemo {
    static <T, V extends T> boolean isIn(T x, V[] y) {
        for (int i = 0; i < y.length; i++)
            if (x.equals(y[i]))
                return true;
        return false;
    }

    /*when compiled in java 7 it producing an error and compiling in java 8 without error */
    public static void main(String args[]) {
        Integer nums[] = {1, 2, 3, 4, 5};
        String s[] = {"one", "two", "three"};
        System.out.println(isIn("fs", nums));
      /*
      when compiled in java 7 it producing an error and compiling in java 8 without error */
    }
}

【问题讨论】:

  • 请编辑您的问题以显示描述问题的文本。特别是,您在 Java 7 中遇到了什么错误?
  • isIn("fs", nums) 不应该工作,因为在这种情况下,T 将是 StringV 将是 Integer,它不会扩展 String。但是,Java 8 类型推断可能更宽松,因为它会尝试找到匹配的 T = ObjectV = Object

标签: java


【解决方案1】:

这是由于 Java 8 中的 Generalized Target-type Inference 改进。实际上,我上周回答了一个类似的问题。 Java 8 call to generic method is ambiguous

第一个问题Java 8: Reference to [method] is ambiguous的回答也很好。

Java 8 能够推断传递给泛型方法的参数类型。正如@Thomas 在他的评论中所说,T 类型被推断为ObjectV 被推断为扩展Object 的对象,因此Integer。在 Java 7 中,这只会引发错误,因为 Integer 显然没有扩展 String

【讨论】:

    【解决方案2】:

    在 Java 7 中,类型推断会看到 T = StringV = Integer,它们不能满足 V extends T

    但是,Java 8 的 JLS 声明这将起作用:

    List<Number> ln = Arrays.asList(1, 2.0);
    

    因此,在您的情况下,这将被解析为 T = V = Object

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2018-03-10
      相关资源
      最近更新 更多