通用方法调用

the*_*ere 7 java generics

我有这段代码来自"Java - 初学者指南 - Schildt",第13章:

package com.chapter.thirteen;

public class GenericMethodDemo {
static <T extends Comparable<T>, V extends T> boolean arraysEqual(T[] x, V[] y){
    if(x.length != y.length) return false;

    for(int i = 0; i < x.length; i++)
        if(!x[i].equals(y[i])) return false;

    return true;
}

public static void main(String args[]){

    Integer [] nums  = { 1, 3, 3, 4, 6 };
    Integer [] nums2 = { 1, 3, 3, 4, 6 };
    Integer [] nums3 = { 1, 3, 3, 4, 6 };
    Integer [] nums4 = { 1, 3, 3, 4, 6, 7};
    Double [] dVals = {1.1, 2.2, 3.3, 4.4};

    if(arraysEqual(nums, nums))
        System.out.println("nums equal nums");

    if(arraysEqual(nums, nums2))
        System.out.println("nums equal nums2");

    if(arraysEqual(nums, nums2))
        System.out.println("nums equal nums2");

    if(arraysEqual(nums, nums3))
        System.out.println("nums equal nums3");

    if(arraysEqual(nums, nums4))
        System.out.println("nums equal nums4");

    //Edit:Removed the comments from the below two lines.

    if(arraysEqual(nums, dVals))
        System.out.println("Nums equal dVals");

    }
}
Run Code Online (Sandbox Code Playgroud)

编译失败并显示消息 - "Error:(39, 12) java: method arraysEqual in class com.chapter.thirteen.GenericMethodDemo cannot be applied to given types; required: T[],V[] found: java.lang.Integer[],java.lang.Double[] reason: inference variable T has incompatible bounds equality constraints: java.lang.Integer lower bounds: V,java.lang.Double,java.lang.Integer"这是预期的.

但是,当我错过将参数添加到Comparable时(如下面的代码所示),代码会编译并生成正确的结果.

package com.chapter.thirteen;


public class GenericMethodDemo {
    static <T extends Comparable, V extends T> boolean arraysEqual(T[] x, V[] y){
    if(x.length != y.length) return false;

    for(int i = 0; i < x.length; i++)
        if(!x[i].equals(y[i])) return false;

    return true;
}

public static void main(String args[]){

    Integer [] nums  = { 1, 3, 3, 4, 6 };
    Integer [] nums2 = { 1, 3, 3, 4, 6 };
    Integer [] nums3 = { 1, 3, 3, 4, 6 };
    Integer [] nums4 = { 1, 3, 3, 4, 6, 7};
    Double [] dVals = {1.1, 2.2, 3.3, 4.4};

    if(arraysEqual(nums, nums))
        System.out.println("nums equal nums");

    if(arraysEqual(nums, nums2))
        System.out.println("nums equal nums2");

    if(arraysEqual(nums, nums2))
        System.out.println("nums equal nums2");

    if(arraysEqual(nums, nums3))
        System.out.println("nums equal nums3");

    if(arraysEqual(nums, nums4))
        System.out.println("nums equal nums4");

    if(arraysEqual(nums, dVals))
        System.out.println("Nums equal dVals");
   }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么编译在第二种情况下不会失败吗?我曾经期望编译器抱怨T扩展Comparable,V在第二个实例中扩展T

这是怎么回事?

Zor*_*art 0

该方法arraysEqual被声明为接收V具有T超类型的类型。换句话说,V必须实施或扩展Tjava.lang.Double( V) 和java.lang.Integer( )则不是这种情况T,因此构成编译错误。

编辑添加 如果您从中删除参数化Comparable(将其声明为Comparablenot Comparable<T>),编译器会看到Tas Comparable, not as Comparable<Integer>,然后V被视为V extends Comparableis java.lang.Double