Java 中的子類泛型轉型成父類泛型 步驟 1 : 對象轉型 根據面向對象學習的知識,子類轉父類 是一定可以成功的 package generic; import charactor.ADHero; import charactor.Hero; public class TestGeneric { ...
Java 中的子類泛型轉型成父類泛型
步驟 1 : 對象轉型
根據面向對象學習的知識,子類轉父類 是一定可以成功的
package generic;
import charactor.ADHero;
import charactor.Hero;
public class TestGeneric {
public static void main(String[] args) {
Hero h = new Hero();
ADHero ad = new ADHero();
//子類轉父類
h = ad;
}
}
步驟 2 : 子類泛型轉父類泛型
既然 子類對象 轉 父類對象是可以成功的,那麼子類泛型轉父類泛型能成功嗎?
如代碼
hs的泛型是父類Hero
adhs 的泛型是子類ADHero
那麼 把adhs轉換為hs能成功嗎?
package generic;
import java.util.ArrayList;
import charactor.ADHero;
import charactor.Hero;
public class TestGeneric {
public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>();
//子類泛型轉父類泛型
hs = adhs;
}
}
步驟 3 : 假設可以轉型成功
假設可以轉型成功
引用hs指向了ADHero泛型的容器
作為Hero泛型的引用hs, 看上去是可以往裡面加一個APHero的。
但是hs這個引用,實際上是指向的一個ADHero泛型的容器
如果能加進去,就變成了ADHero泛型的容器里放進了APHero,這就矛盾了
所以子類泛型不可以轉換為父類泛型
package generic;
import java.util.ArrayList;
import charactor.ADHero;
import charactor.APHero;
import charactor.Hero;
public class TestGeneric {
public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>();
//假設能轉換成功
hs = adhs;
//作為Hero泛型的hs,是可以向其中加入APHero的
//但是hs這個引用,實際上是指向的一個ADHero泛型的容器
//如果能加進去,就變成了ADHero泛型的容器里放進了APHero,這就矛盾了
hs.add(new APHero());
}
}
練習: 父類泛型能否轉換為子類泛型?
上面使用反證法分析了,子類泛型不能轉換為父類泛型。
那麼父類泛型又能否轉換成子類泛型? 為什麼?
package generic;
import java.util.ArrayList;
import charactor.ADHero;
import charactor.Hero;
public class TestGeneric {
public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>();
//父類泛型轉子類泛型,能否成功?為什麼?
adhs = hs;
}
}
答案:
假設能成功
這個時候adhs實際上指向的是泛型是Hero的容器,而這個容器里可能放的是一個APHero
而根據泛型,直接取出來就轉型成了ADHero
所以就變成了APHero轉型成ADHero,這是矛盾的。
所以反推,父類泛型不能轉型為子類泛型
package generic;
import java.util.ArrayList;
import charactor.ADHero;
import charactor.Hero;
public class TestGeneric {
public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>();
//假設能成功
adhs = hs;
//這個時候adhs實際上指向的是泛型是Hero的容器,而這個容器里可能放的是一個APHero
//而根據泛型,直接取出來就轉型成了ADHero
//所以就變成了APHero轉型成ADHero,這是矛盾的。
ADHero ad =adhs.get(0);
}
}