關於JAVA中的Class.cast方法
阿新 • • 發佈:2021-02-13
前言
今天在閱讀專案程式碼時候,發現了Class類的方法cast() ,出於興趣閱讀了一下原始碼,將心得感受寫出來分享一下。
1、先定義一個介面 Tree
//抽象出 一個父類 即使 沒有這個也沒事 可以返回object 這個萬類之父
public interface Tree {
//輸出自己的品種
void sout();
//空物件模式 需要的
boolean isNUll();
}
2、再建立兩個實現類 Apple 和Banana
//AppleTree的實現類
public class AppleTree implements Tree {
@Override
public void sout() {
System.out.println("我是蘋果樹");
}
@Override
public boolean isNUll() {
return false;
}
}
//BananaTree的實現類
public class BananaTree implements Tree {
@Override
public void sout() {
System.out. println("我是香蕉樹");
}
@Override
public boolean isNUll() {
return false;
}
}
3.重點部分
public class CastMain {
public static void main(String[] args) {
AppleTree appleTree = new AppleTree();
Tree one = Tree.class.cast(appleTree);
one.sout() ;
//強制型別轉換
Tree force = (Tree) appleTree;
force.sout();
Tree two = BananaTree.class.cast(appleTree);
two.sout();
}
}
執行這部分程式碼,結果如下。
呼叫了兩次 apple類的方法,到 Tree two = BananaTree.class.cast(appleTree); 拋異常了。異常告訴我們 Banana 不能轉換成 Apple。
到這裡 有的人就明白了 Tree one = Tree.class.cast(appleTree); 不就是強制轉換麼? 我可以肯定的告訴你 。嗯 是的 就是強制轉換型別
4.總結
這裡我們來看一下原始碼
@SuppressWarnings("unchecked")
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}
原始碼裡面 將得到的obj 用T泛型 強制轉換了,至於T泛型 在哪裡定義的public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement
也就是說呢 Tree.class 和Class< Tree>
兩者是等價
綜上所述:Class.cast(Object obj)方法 就是作用就是強制型別轉換。將obj轉化成T型別。