[英]Does int.class autobox to Class<Integer>
我相信我的問題沒有意義,但這是因為我不知道我在看什么或如何描述它...
下面的代碼編譯得很好,但不應該因為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>
你觀察到的是泛型處理基元的方式的直接結果,它不是自動裝箱。 為了在使用類信息(如泛型或反射)的情況下保持一致,在某些情況下,原始類型需要在檢查其類型時返回。
取消引用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.