Java自學-泛型 泛型轉型

来源:https://www.cnblogs.com/jeddzd/archive/2020/01/22/12228758.html
-Advertisement-
Play Games

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 Angular 中最常用的指令分為兩種,它們分別是 屬性型指令 和 結構型指令 。 NgClass 作用:添加或移除一組 CSS 類 NgStyle 作用:添加或移除一組 CSS 樣式 NgModel 作用:雙向綁定到 HTML 表單元素 NgIf 作用:根據條件添加或移除 DOM 語法: 我們 ...
  • 幾乎所有前端框架都在玩“組件化”,而且最近都不約而同地選擇了“標簽化”這種思路,Angular 也不例外。 對新版本的 Angular 來說,一切都是圍繞著“組件化”展開的,組件是 Angular 的核心概念模型。 組件的定義 以下是一個最簡單的 Angular 組件定義: :這是一個 Decora ...
  • angular核心特性 很多開發者已經做過非常多的項目,但是當你跟他聊的時候,你很快就會發現他並沒有掌握這門框架的精髓。打幾個比方,當別人提到 Spring 的時候,你的大腦裡面第一個想到一定是 DI、IOC、AOP 這些東西;當別人提到 Hibernate 或者 Mybatis 的時候,你的大腦里 ...
  • 時間是這個世界上最公平東西,歲月不曾饒過誰,任何人都無法逃脫自然規律,我們程式員都要面對 35 歲這道坎,過了 35 歲就不能再跟年輕人拼體力了。隨著年齡的增長,體力不再是優勢了,這時候的優勢是更加成熟的心智,豐富的工作經歷,以及對自我更加清晰的認知。在綜合這些優勢的基礎上,重新找準自己的價值定位,... ...
  • content: 1. 為什麼要多進程編程?和多線程有什麼區別? 2. python 多進程編程 3. 進程間通信 一. 為什麼要多進程編程?和多線程有什麼區別? 由於GIL的存在,所以對於某一些多線程任務來說,無法利用多核的優勢,對這些耗cpu的任務,用多進程反而能利用多cpu。 所以多cpu的操 ...
  • 開發環境: Windows操作系統開發工具: MyEclipse+Jdk+Tomcat+MYSQL資料庫運行效果圖: 源碼及原文地址:http://javadao.xyz/forum.php?mod=viewthread&tid=73 ...
  • 本文主要介紹在web開發中經常被使用的Django框架。無論是老手亦或是剛接觸Django的開發者,肯定都會被Django易上手、周期短等優點所吸引。同樣,筆者也是特別是對其最初的設計邏輯很感興趣,於是筆者結合自己的學習在本文主要介紹Django框架的設計邏輯以及自己的一些理解,期望可以在加深本人理... ...
  • 1. 視圖 視圖的功能就是接收請求,進行處理,與M和T進行交互,返回應答。 返回html內容HttpResponse,也可能重定向redirect,還可以返回json數據。 1.1 URLconf 1.1.1 配置 用戶通過在瀏覽器的地址欄中輸入網址請求網站,對於Django開發的網站,由哪一個視圖 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...