《java開發實戰經典》李興華——C10. 泛型
阿新 • • 發佈:2018-12-21
一、為什麼使用泛型
類轉換異常,出現了型別安全問題
二、泛型應用
1.泛型的基本應用
在定義類時,通過一個識別符號表示類的種某屬性的型別,或某種方法的返回值及引數型別。
這樣在例項化時只需要指定好需要的型別即可。
2.示例:
public class Test{ public static void main(String[] args) { Point<String> p = new Point<String>(); p.setVar("李興華"); System.out.println(p.getVar().length()); } } class Point <T>{ private T var; public T getVar() { return var; } public void setVar(T var) { this.var = var; } }
3.泛型中的構造方法
class Point <T>{ private T x; private T y; public Point(T x,T y) { this.setX(x); this.setY(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 Test{ public static void main(String[] args) { Point<Integer> p = new Point<Integer>(11, 22); int x = p.getX(); int y = p.getY(); System.out.println("整數表示,X座標:"+x); System.out.println("整數表示,Y座標:"+y); } }
4.指定多個泛型型別
class Notepad <K,V>{ private K key; private V value; public K getKey() { return key; } public void setKey(K key) { this.key = key; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } } public class Test{ public static void main(String[] args) { Notepad<String,Integer> n = new Notepad<String,Integer>(); n.setKey("李興華"); n.setValue(30); System.out.println("姓名:"+n.getKey()); System.out.println("年齡:"+n.getValue()); } }
三、泛型的安全警告
使用者在宣告物件時最好指定其內部的資料型別,否則就會出現不安全的警告資訊。
編譯時警告,但不影響程式執行。
四、萬用字元
1.匹配任意型別的萬用字元
class Info <T>{
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
@Override
public String toString() {
return this.var.toString();
}
}
public class Test{
public static void main(String[] args) {
Info<String> i = new Info<String>();
Info<Integer> j = new Info<Integer>();
i.setVar("李興華");
j.setVar(30);
fun(i);
fun(j);
System.out.println("內容:"+i.getVar());
}
public static void fun(Info<?> temp) {//?:萬用字元
System.out.println("內容:"+temp);
}
}
2.受限泛型
1)設定上限: ? extends 類
泛型標識 extends 類
2)設定下限:? super 類
泛型標識 super 類
class Info <T>{
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
public String toString() {
return this.getVar().toString();
}
}
public class Test{
public static void main(String[] args) {
Info<Float> i = new Info<Float>();
Info<Integer> j = new Info<Integer>();
i.setVar(6.6f);
j.setVar(30);
fun(i);
fun(j);
}
//上限為number,可以傳Byte,Short,Long,Integer,Float,Double
public static void fun(Info<? extends Number> temp) {
System.out.println("內容:"+temp);
}
}
class Info <T>{
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
public String toString() {
return this.getVar().toString();
}
}
public class Test{
public static void main(String[] args) {
Info<Object> i = new Info<Object>();
Info<String> j = new Info<String>();
i.setVar(new Object());
j.setVar("李興華");
fun(i);
fun(j);
}
//下限為String,可以傳String,Object
public static void fun(Info<? super String> temp) {
System.out.println("內容:"+temp);
}
}
五、泛型與子類繼承的限制
子類的泛型型別不能用父類的泛型型別接收。如Info<String>不能用Info<Object>接收。
六、泛型介面
1.定義泛型介面
interface 介面名稱<泛型標識>{ }
2.泛型介面的兩種實現方式
//第一種:在子類得定義上宣告泛型型別
interface Info<T>{
public T getVar();
}
class InfoImpl<T> implements Info<T>{
private T var;
public InfoImpl(T var){
this.setVar(var);
}
public void setVar(T var) {
this.var = var;
}
@Override
public T getVar() {
return this.var;
}
}
public class Test{
public static void main(String[] args) {
Info<String> i = null;
i = new InfoImpl<String>("lll");
System.out.println(i.getVar());
}
}
//第二種:直接在介面中指定具體型別
interface Info<T>{
public T getVar();
}
class InfoImpl implements Info<String>{
private String var;
public InfoImpl(String var){
this.setVar(var);
}
public void setVar(String var) {
this.var = var;
}
@Override
public String getVar() {
return this.var;
}
}
public class Test{
public static void main(String[] args) {
Info<String> i = null;
i = new InfoImpl("lll");
System.out.println(i.getVar());
}
}