1. 程式人生 > >泛型-自定義類上的泛型,方法的泛型

泛型-自定義類上的泛型,方法的泛型

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;