int.class autobox是否为Class <integer>

时间:2016-03-02 07:45:52

标签: java primitive boxing

我确信我的问题没有意义,但这是因为我不知道我在看什么或如何描述它......

以下代码编译正常,但不应该因为intInteger的类型不同。难道这不会给编译器错误吗?如果编译器期望Class<Integer>的类型在运行时如何解析为Class<int>?这是编译器让它继续使用原语的一些魔力吗?如果编译器放松了对原语的验证,则不会导致方法编写者期望类型为EXACT类型Class<Integer>而是传递Class<int>的错误。

简而言之,为什么这会在运行时编译并生成correctwrong(取决于透视图)结果。

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>

3 个答案:

答案 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) {