泛型-自定義類上的泛型,方法的泛型
package com.atguigu.javase.generic; import java.util.ArrayList; import java.util.List; import org.junit.Test; // 自定義泛型類, A只能是類型別 class Person<A> { // A在這裡表示它是某種型別, 型別的形參, 在本類中就可以直接使用A這個型別. // A型別在建立物件時指定. // 如果A型別在建立物件時,並未確定的指定, 它就是Object型別, 型別不安全了 // 泛型型別隸屬於物件的, 不同的物件在建立時指定的泛型型別可以不一樣 private String name; private A info; public Person() { } public Person(String name, A info) { super(); this.name = name; this.info = info; } public void setInfo(A info) { this.info = info; } public A getInfo() { return info; } public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Person [name=" + name + ", info=" + info + "]"; } /* 靜態成員不可以使用泛型型別 public static void test(A a) { }*/ /** * 泛型方法, 方法中的泛型型別在方法的返回值之前宣告<泛型的型別引數> * 泛型方法必須在形參中指定好特定的型別, 否則泛型方法中的泛型型別永遠是Object * 泛型方法中的泛型型別究竟是什麼, 由實參來決定.所以是在方法的每一次呼叫時才能確定的. * 如果實參是null, 則無法確定泛型型別, 只能是Object型別了. * @return */ public <B> B testB(B b) { return null; } } class A<X> { X x; public X getX() { return x; } } class B extends A {} // 子類在繼承時並未指定X的具體型別, 所以永遠是Object class C extends A<String> {} // 子類在繼承時直接寫死父類的泛型型別, 在子類中X型別永遠是一致,不變的 class C2 extends A<Double> {} class D<X> extends A<X> {} // 子類在繼承父類時仍然保持泛型型別的不確定性. public class GenericTest { @Test public void test6() { B b = new B(); Object x = b.getX(); C c = new C(); String x2 = c.getX(); D d = new D(); Object x3 = d.getX(); D<Integer> d2 = new D<Integer>(); Integer x4 = d2.getX(); String x5 = new D<String>().getX(); } @Test public void test5() { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10; i++) { list.add((int)(Math.random() * 20)); } System.out.println(list); Object[] array = list.toArray(); for (Object object : array) { System.out.println(object); } System.out.println("**********************"); Integer[] array2 = list.toArray(new Integer[] {}); for (Integer integer : array2) { System.out.println(integer); } } @Test public void test4() { Person<String> person = new Person<String>("張三", "北京"); Integer testB = person.testB(30); String testB2 = person.testB("男"); Boolean testB3 = person.testB(false); Object testB4 = person.testB(null); // 當實參的型別無法確定時, 泛型方法中的型別就是Object } @Test public void test3() { List<Integer> list1 = new ArrayList<Integer>(); List<Double> list2 = new ArrayList<Double>(); } @Test public void test2() { // 在這個物件中的A型別就固定是String型別 Person<String> person = new Person<String>("張三", "北京"); // String在建立物件時,會作為類中的A型別的具體型別 String info = person.getInfo(); System.out.println(info); //person.setInfo(30); //new Person<Integer>("李四", "上海"); Person<Integer> person2 = new Person<Integer>("李四", 40); Integer info2 = person2.getInfo(); System.out.println(info2); } @Test public void test1() { Person person = new Person("張三", 30); // 理論上A型別就是Integer了, 但是沒有指定 Object info = person.getInfo(); System.out.println(info); person.setInfo("男"); // 在這裡體現了型別不安全, 因為理論上型別是Integer,但是實際給定的是String Person person2 = new Person("李四", "女"); Object info2 = person2.getInfo(); System.out.println(info2); } }
靜態方法不能使用泛型,因為靜態方法隸屬於類,而泛型是繫結到物件上的
對於更精確的型別確定,可以使用泛型方法
相關推薦
泛型-自定義類上的泛型,方法的泛型
package com.atguigu.javase.generic; import java.util.ArrayList
Ueditor自定義圖片上傳路徑,以及圖片回顯路徑
最近發現Ueditor有個小bug,每次圖片都上傳到專案路徑下,當重新發佈一個版本後,圖片就沒了,所以決心修改結構如下:1. 首先,進入config.json,修改如下:其他的都不改,只改選中部分,這個是圖片訪問路徑字首我們要關注的是【檔案訪問路徑】和【檔案上傳路徑】然後,分
swift 自定義類的建構函式,有參構造、無參構造
import UIKit class person : NSObject { var name : String? var age : Int = 0 //1.重寫
HashMap中使用自定義類作為Key時,為何要重寫HashCode和Equals方法
ide string https object 避免 equals方法 args sys 添加 之前一直不是很理解為什麽要重寫HashCode和Equals方法,才只能作為鍵值存儲在HashMap中。通過下文,可以一探究竟。 首先,如果我們直接用以下的Person類
Lambda語句中創建自定義類型時,也可指定某種特定類型,方法是在new與{}之間寫上類型名稱
特定 pan sel lambda語句 lam {} where distinct select 如: var fc =...ChildFath = fc.Select(c => new Child_Father { child = c.child, father =
ArrayList儲存自定義物件並遍歷,要求加入泛型,並用增強for遍歷
import java.util.ArrayList;import java.util.Iterator;public class ArrayListDemo1 {public static void
C# 泛型自定義集合
一.原型 public class InList { int[] arr = new int[10]; int index = 0;
List泛型自定義型別排序和大小比較C#版
想刪除一堆大小相同的檔案,於是想到用List泛型自定義型別排序和大小比較,準備先大小排序,再比較刪除同大小的 1、隨便來個自定義類 public class FileSort { long filesize; public long
自定義類型轉換器之TypeConverter
can con ont rto 方法 contex int 讓我 tor C#提供了很多類型轉換的方法如ConvertToInt、int.Parse、int.tryParse等等,這些方法都能將一個C#的基本數據類型轉換成另一個C#基本數據類型.那麽.既然如此,C#肯定
自定義類型的乘法口訣表
定義函數 stdio.h void ++ define oid 之前 scan warnings 之前有寫過乘法口訣表,這次利用函數,做一個可以自定義函數的代碼。 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
Hadoop學習筆記—5.自定義類型處理手機上網日誌
clas stat 基本 手機上網 oop interrupt pil 依然 手機號碼 一、測試數據:手機上網日誌 1.1 關於這個日誌 假設我們如下一個日誌文件,這個文件的內容是來自某個電信運營商的手機上網日誌,文件的內容已經經過了優化,格式比較規整,便於學習研究。
QSet使用及Qt自定義類型使用QHash等算法
算法 har 地址 node slc doc support ati tarray 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QSet使用及Qt自定義類型使用QHash等算法 本文地址:http://
工作總結 Rezor 裏面的一些小知識----自定義類型 放在標簽值中 會直接跳過去
直接 技術 例如 images 定義變量 png 索引 log blog 0 的時候不報錯 1 的時候 報錯了 原因 是 imagesname[i] 索引超出了 為什麽在 上面 報錯呢? 不在這裏報錯呢? 說明了 Rezor 對於 自定義的變量 放在標
Idea_學習_03_IDEA中使自定義類型的文件進行代碼高亮識別
segment tar register 定義 類型 自定義類 pos edi ref 如果你只是想用xml的編輯模式來編輯*.screen文件的話,可以在 Settings->Editor->File Types 中,在Recognized File Ty
自定義類型轉換
args main class ati this exceptio 自定義類型 測試 blog 這裏說點平常不怎麽用的知識(也不建議在項目中運行,因為增加閱讀代碼成本)。自定義類型轉換,有兩類型:一是類型間隱式轉換,一是類型間強制轉換。 定義格式: 訪問修飾符 static
Kubernetes operator 如何根據自定義類型生成響應的代碼的?
kubernetes operator types 分享這篇文章的主要目的,是如何利用kubernetes來自定義類型,如SparkApplication,從而使用腳本,生成響應的代碼的這些代碼是專門為自定義的類型SparkApplication對象服務的0、最終效果如下:1、測試環境說明VMwa
Spring MVC 自定義類型轉換器
import rtm ring type class ota 轉換 spa 新建 新建一個自定義轉換器 import org.springframework.core.convert.converter.Converter; import org.springfra
java自定義類型 作為HashMap中的Key值 (Pair<V,K>為例)
由於 con als void hash system 進行 原型 自定義 由於是自定義類型,所以HashMap中的equals()函數和hashCode()函數都需要自定義覆蓋。 不然內容相同的對象對應的hashCode會不同,無法發揮算法的正常功能,覆蓋equals函
springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。
ansi req -type this spring 進行 name ext code springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和運行時異常Ru
淺析HashSet add() 方法存儲自定義類型對象的過程
style 過程 字符串相同 span bject str 返回值 string boolean 一、自定義一個Student類 package date0504; public class Student { private String id;