Java 中的子類泛型轉(zhuǎn)型成父類泛型
步驟 1 : 對象轉(zhuǎn)型
根據(jù)面向?qū)ο髮W(xué)習(xí)的知識,子類轉(zhuǎn)父類 是一定可以成功的
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();
//子類轉(zhuǎn)父類
h = ad;
}
}
步驟 2 : 子類泛型轉(zhuǎn)父類泛型
既然 子類對象 轉(zhuǎn) 父類對象是可以成功的,那么子類泛型轉(zhuǎn)父類泛型能成功嗎狈涮?
如代碼
hs的泛型是父類Hero
adhs 的泛型是子類ADHero
那么 把a(bǔ)dhs轉(zhuǎn)換為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<>();
//子類泛型轉(zhuǎn)父類泛型
hs = adhs;
}
}
步驟 3 : 假設(shè)可以轉(zhuǎn)型成功
假設(shè)可以轉(zhuǎn)型成功
引用hs指向了ADHero泛型的容器
作為Hero泛型的引用hs, 看上去是可以往里面加一個APHero的。
但是hs這個引用,實(shí)際上是指向的一個ADHero泛型的容器
如果能加進(jìn)去膜赃,就變成了ADHero泛型的容器里放進(jìn)了APHero豌注,這就矛盾了
所以子類泛型不可以轉(zhuǎn)換為父類泛型
假設(shè)可以轉(zhuǎn)型成功
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<>();
//假設(shè)能轉(zhuǎn)換成功
hs = adhs;
//作為Hero泛型的hs,是可以向其中加入APHero的
//但是hs這個引用伤塌,實(shí)際上是指向的一個ADHero泛型的容器
//如果能加進(jìn)去,就變成了ADHero泛型的容器里放進(jìn)了APHero轧铁,這就矛盾了
hs.add(new APHero());
}
}
練習(xí): 父類泛型能否轉(zhuǎn)換為子類泛型每聪?
上面使用反證法分析了,子類泛型不能轉(zhuǎn)換為父類泛型。
那么父類泛型又能否轉(zhuǎn)換成子類泛型药薯? 為什么他爸?
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<>();
//父類泛型轉(zhuǎn)子類泛型,能否成功果善?為什么诊笤?
adhs = hs;
}
}
答案:
假設(shè)能成功
這個時候adhs實(shí)際上指向的是泛型是Hero的容器,而這個容器里可能放的是一個APHero
而根據(jù)泛型,直接取出來就轉(zhuǎn)型成了ADHero
所以就變成了APHero轉(zhuǎn)型成ADHero巾陕,這是矛盾的讨跟。
所以反推,父類泛型不能轉(zhuǎn)型為子類泛型
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<>();
//假設(shè)能成功
adhs = hs;
//這個時候adhs實(shí)際上指向的是泛型是Hero的容器,而這個容器里可能放的是一個APHero
//而根據(jù)泛型鄙煤,直接取出來就轉(zhuǎn)型成了ADHero
//所以就變成了APHero轉(zhuǎn)型成ADHero晾匠,這是矛盾的。
ADHero ad =adhs.get(0);
}
}