我有这段代码来自"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?
这是怎么回事?
该方法arraysEqual被声明为接收V具有T超类型的类型。换句话说,V必须实施或扩展T。java.lang.Double( V) 和java.lang.Integer( )则不是这种情况T,因此构成编译错误。
编辑添加
如果您从中删除参数化Comparable(将其声明为Comparablenot Comparable<T>),编译器会看到Tas Comparable, not as Comparable<Integer>,然后V被视为V extends Comparableis java.lang.Double。
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |