一文帶你認識Java泛型基礎
Java泛型基礎
- 認識泛型
泛型是在JDK1.5之後增加的新功能.
泛型可以解決資料的安全性問題, 主要的原理是在類宣告的時候通過一個標識表示類中某個屬性的型別或者是某個方法的返回值及引數型別.
格式:
訪問許可權 class 類名稱<泛型, …="">{
屬性
方法
}
物件的建立:
類名稱<具體型別> 物件名稱 = new 類名稱<具體型別>();
示例
/**
- 經緯度
- @author dixin
*/
class Point {
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
public class GenericDemo01 {
public static void main(String[] args) { Point p1 = new Point(); p1.setX("經度為10"); p1.setY("緯度為100"); Point p2 = new Point(); p2.setX(10); p2.setY(100); System.out.println(p1.getX() + ", " + p1.getY()); System.out.println(p2.getX() + ", " + p2.getY()); }
}
// 執行結果
經度為10, 緯度為100
10, 100
- 構造方法中使用泛型
class Con {
private T value;
// 類定義中已經定義泛型T, 方法中可以直接使用, 不用加<>
public Con(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
public class GenericDemo02 {
public static void main(String[] args) {
Con c = new Con("構造方法中使用泛型");
System.out.println(c.getValue());
}
}
- 設定多個泛型
兩個泛型的例子:
class Gen {
private K key;
private T value;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
public class GenericDemo03 {
public static void main(String[] args) {
Gen gen = new Gen();
gen.setKey("key");
gen.setValue(10);
System.out.println(gen.getKey() + ", " + gen.getValue());
}
}
4. 萬用字元
型別不統一問題
class Info {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
@Override
public String toString() {
return this.getValue().toString();
}
}
public class GenericDemo04 {
public static void main(String[] args) {
Info i = new Info();
i.setValue("型別不統一");
tell(i); // 編譯報錯
// The method tell(Info) in the type GenericDemo04 is not applicable for the arguments
(Info)
}
public static void tell(Info i) {
System.out.println(i);
}
}
原因:
泛型是不可變的, 對於任意兩個不同的型別Type1和Type2, List既不是List的子型別, 也不是List的父型別. 所以這裡不能將轉換成.
解決方式:
public static void tell(Infoi)中去掉, 使用raw型別, 但這樣就失去了泛型的安全性檢查意義.
更好的方式, 採用萬用字元.
修改為public static void tell(Info i)
- 泛型介面
宣告泛型介面和宣告泛型類的語法類似, 也是在介面名稱後面加上.
格式: interface 介面名稱<泛型標識>
interface IGen {
public void say();
}
class GenImpl implements IGen {
private String info;
public GenImpl(String info) {
this.info = info;
}
public void setInfo(String info) {
this.info = info;
}
public String getInfo() {
return info;
}
@Override
public void say() {
System.out.println(this.info);
}
}
public class GenericDemo05 {
public static void main(String[] args) {
IGen g = new GenImpl("泛型介面");
g.say();
}
}
- 泛型方法
泛型方法中可以定義泛型引數, 此時, 引數的型別就是傳入資料型別.
格式:訪問許可權 <泛型標識> 泛型標識 方法名稱([泛型標識 引數名稱])
T tell(T t) {
return t;
}
}
// 執行結果
Hello
10
7. 泛型陣列
泛型陣列的使用要和泛型方法搭配使用.
在使用泛型方法的時候, 也可以傳遞或返回一個泛型陣列.
public class GenericDemo07 {
public static void main(String[] args) {
String arrStr[] = { "A", "B", "C" };
tell(arrStr);
Integer arrInt[] = { 1, 2, 3 };
tell(arrInt);
}
public static void tell(T arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
最後,如果你跟我一樣都喜歡java,想成為一名優秀的程式設計師,也在學習java的道路上奔跑,歡迎你加入java學習群:72030155 群內每天都會分享java最新業內資料,分享java免費課程,共同交流學習,讓學習變(編)成(程)一種習慣!