我确信我的问题没有意义,但这是因为我不知道我在看什么或如何描述它......
以下代码编译正常,但不应该因为int
与Integer
的类型不同。难道这不会给编译器错误吗?如果编译器期望Class<Integer>
的类型在运行时如何解析为Class<int>
?这是编译器让它继续使用原语的一些魔力吗?如果编译器放松了对原语的验证,则不会导致方法编写者期望类型为EXACT类型Class<Integer>
而是传递Class<int>
的错误。
简而言之,为什么这会在运行时编译并生成correct
或wrong
(取决于透视图)结果。
public static void main(String[] args) {
printClass("int ", int.class);
printClass("Integer ", Integer.class);
System.out.printf("AreEqual", int.class == Integer.class);
}
private static void printClass(String text, final Class<Integer> klazz) {
System.out.printf("%s: %s%s", text, klazz, "\n");
}
输出:
int : int
Integer : class java.lang.Integer
AreEqual: false
对于控制组,此代码按照我的预期NOT COMPILE
执行
public static void main(String[] args) {
printClass("Person ", Person.class);
printClass("Employee", Employee.class);
System.out.printf("AreEqual: %s", Person.class == Employee.class);
}
private static void printClass(String text, final Class<Person> klazz) {
System.out.printf("%s: %s%s", text, klazz, "\n");
}
public class Employee extends Person {
}
public class Person {
}
错误:
Error:(8, 40) java: incompatible types: java.lang.Class<com.company.Employee> cannot be converted to java.lang.Class<com.company.Person>
答案 0 :(得分:15)
您观察到的是泛型处理基元的方式的直接结果,它不是自动装箱。为了在使用类信息(如泛型或反射)的情况下保持一致,在某些情况下,原始类型在检查其类型时需要返回一些东西。
取消引用anyprimitivetype.class
时,将返回封闭包装类中的TYPE字段。在你的情况下它是:
int.class -> public static final Class<Integer> TYPE
您可以在此处找到所有原始类型加上void的完整列表: primitives
它们是自1.1以来语言规范的一部分。
答案 1 :(得分:3)
因为Java 5的原始类型存在隐式自动装箱。 对于其他类型,您需要使用其他语法来实现您的目标:搜索泛型。
试试这个:
var totalHotel = json.SearchAvailResponse.Hotel.length;
// console.log(totalHotel);
var hotel = '';
var hotels = [];
for(var i=0;i<totalHotel;i++){
if(jQuery.inArray(json.SearchAvailResponse.Hotel[i].Name, hotels) == -1)
{
hotels.push(json.SearchAvailResponse.Hotel[i].Name);
hotel += json.SearchAvailResponse.Hotel[i].Name;
hotel += '<br/>';
}
}
答案 2 :(得分:3)
那是因为这是java泛型的工作方式。如果要允许所有继承自Person的类,可以使用:
private static void printClass(String text, final Class<? extends Person> klazz) {