Java自學-泛型 泛型轉型

Java 中的子類泛型轉型成父類泛型

步驟 1 : 對象轉型html

根據面向對象學習的知識,子類轉父類 是必定能夠成功的java

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 的泛型是子類ADHerocode

那麼 把adhs轉換爲hs能成功嗎?htm

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,這就矛盾了blog

因此子類泛型不能夠轉換爲父類泛型get

假設能夠轉型成功

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());
    }
 
}

練習父類泛型可否轉換爲子類泛型?ast

上面使用反證法分析了,子類泛型不能轉換爲父類泛型。class

那麼父類泛型又可否轉換成子類泛型? 爲何?

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);
         
    }
  
}
相關文章
相關標籤/搜索