class Utilities {
public static <T> void flo(T k, T p){}
}
public class UtilitiesTest {
public static void main(String []args) {
Utilities.flo(5,"5"); //почему компилятор не выдает ошибку?
}
}
T 作为单个泛型参数假定相同的类型,对吗?所以在此基础上编译器不会发誓“等一下,你设置了两种不同的类型,但你需要传输相同类型的数据”
但是在这种情况下,编译器为什么不发誓似乎是合乎逻辑的。
class Utilities {
public static <T1,T2> void flo(T1 k, T2 p){}
}
public class UtilitiesTest {
public static void main(String []args) {
Utilities.flo(5,"5"); //а в данном случае понятно почему компилятор спокоен
}
}
但是如果在这个例子中
class Utilities {
public static <T> void fill(List<T> list, T val) {
for(int i = 0; i < list.size(); i++)
list.set(i, val);
}
}
public class UtilitiesTest {
public static void main(String []args) {
List<Integer> intList = new ArrayList<>();
intList.add(10);
intList.add(20);
System.out.println("The original list is: " + intList);
Utilities.fill(intList, 5);
System.out.println("The list after calling Utilities.fill() is: " + intList);
}
}
进行实验,然后由于某种原因编译器记住了它的职责(在某种意义上,“发誓”的职责)
class Utilities {
public static <T> void fill(List<T> list, T val) {
for(int i = 0; i < list.size(); i++)
list.set(i, val);
}
}
public class UtilitiesTest {
public static void main(String []args) {
List<Integer> intList = new ArrayList<>();
intList.add(10);
intList.add(20);
System.out.println("The original list is: " + intList);
Utilities.fill(intList, "5"); //хоть тут компилятор ругается!
System.out.println("The list after calling Utilities.fill() is: " + intList);
}
}
注意:如果突然发现这个问题是重复的,那么只需将链接粘贴在评论中,不要投反对票。如果链接的内容给出了详尽的答案,那么我将删除我的问题。
通用参数类型推断分几个阶段工作。首先,定义参数传递和赋值中涉及的数据类型。在这种情况下,这些将是不同的类型 -
Integer和String. 然后选择最特殊的类型,所选类型可以适合该类型。在这种情况下,显然和Serializable都继承自它。选择此类型作为通用参数。IntegerString在最后一个示例中,将其
Serializable用作参数需要将其List<Serializable>用作第一个参数,并且最佳拟合类型推断失败List<Integer>,因为作为第一个参数传递的 不继承自List<Serializable>,即使它Integer继承自Serializable。一般来说,List<Integer>作为第一个参数传递会立即缩小可能适合作为泛型参数的类型列表Integer,因为它List<Integer>只能转换为Collection<Integer>orIterable<Integer>。