1. 程式人生 > >Java泛型相關

Java泛型相關

for 通過 clas cas equals example ctu out 相關

字節碼對象的三種獲取方式

以String為例

Class<? extends String> strCls = "".getClass();
Class<String> strCls2 = String.class;
Class strCls3 = Class.forName("java.lang.String");

System.out.println(strCls.equals(strCls2)); // true
System.out.println(strCls.equals(strCls3)); // true

對於第一種方式:通過一個String實例的getClass方法來獲取,這個函數的簽名如下:

public final native Class<?> getClass();

但文檔中對這個函數的解釋如下:

The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. For example, no cast is required in this code fragment:
Number n = 0;
Class<? extends Number> c = n.getClass();

所以上面就要用Class<? extends String>來接收返回值了。

對於第三種方式 forName的返回值為 Class<?>,這個等價於Class。例如 List 同 List<?> 是一樣的。

三種方式獲取到的返回值都是一樣的,因為String的字節碼對象也就只有一個。

關於泛型信息的獲取

List<String> ls = new ArrayList<>();
System.out.println(ls.getClass().equals(ArrayList.class));  // true

由於編譯期間存在泛型擦除,所以字節碼對象不會因為泛型而出現差異。

1

Java泛型相關