H5W3
当前位置:H5W3 > 其他技术问题 > 正文

为何java泛型方法限定无效?

相关代码

public class GenericTes {
    public static <T, S extends T> void apply(T t, S s) {

    }
    public static void main(String[] args) throws Exception     {
        apply(new Double(1.0), new Integer(1));
    }

}

题目来源及自己的思路

S我传的new Integer(1),T我传的new Double(1.0),按理泛型方法不是有自动类型推断吗,推断出T是Double,S是Integer,那应该不满足S extends T啊,怎么回事?为啥可以这样传参吗,一点限制都没做?

回答:

表面上是 apply(Double, Integer),实际上是 apply(Number, Integer)
甚至可以写 apply("", 1),因为是apply(Serializable, Integer)

稍微改一下,做个返回值,就很容易看出来了

    public static <T, S extends T> Map<T, S> apply(T t, S s) {
        return new HashMap<>();
    }

    public static void main(String[] args) throws Exception {
        // Map<Double, Integer> map1 = apply(1.0, 1); // 这里报错,因为类型不匹配
        Map<? extends Number, Integer> map = apply(1.0, 1); // 这样就可以了,实际上也是这样

        // 同理
        // Map<String, Integer> map2 = apply("", 1);
        Map<? extends Serializable, Integer> map2 = apply("", 1);
    }

回答:

大哥能说详细点吗,为什么Double编程number了,后面的Integer不变

本文地址:H5W3 » 为何java泛型方法限定无效?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址