簡體   English   中英

int.class autobox是否為Class <Integer>

[英]Does int.class autobox to Class<Integer>

我相信我的問題沒有意義,但這是因為我不知道我在看什么或如何描述它...

下面的代碼編譯得很好,但不應該因為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>

你觀察到的是泛型處理基元的方式的直接結果,它不是自動裝箱。 為了在使用類信息(如泛型或反射)的情況下保持一致,在某些情況下,原始類型需要在檢查其類型時返回。

取消引用anyprimitivetype.class ,將返回封閉包裝類中的TYPE字段。 在你的情況下它是:

 int.class -> public static final Class<Integer> TYPE

您可以在此處找到所有基本類型和void: primitives的完整列表

它們是自1.1以來語言規范的一部分。

因為Java 5的原始類型存在隱式自動裝箱。 對於其他類型,您需要使用其他語法來實現您的目標:搜索泛型。

嘗試這個:

private static void printClass(String text, final Class<? extends Person> klazz) {
    System.out.printf("%s: %s%s", text, klazz, "\n");
}

那是因為這是java泛型工作的方式。 如果要允許所有繼承自Person的類,可以使用:

private static void printClass(String text, final Class<? extends Person> klazz) {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM