java 泛型接口 范型类 范型方法_泛型类、泛型方法、泛型接口
我們知道Object類可以接收任何類型的類,如果描述一個坐標可以用數字描述,也可以用字符串描述(東經 北緯…),Object根據不同的需求接收不同的類可以完成一些操作:
class Position
{
private Object x;
private Object y;
public void setX(Object x) {
this.x = x;
}
public void setY(Object y) {
this.y = y;
}
public Object getX() {
return x;
}
public Object getY() {
return y;
}
}
public class T1
{
public static void main(String[] args)
{
//假設位置是double型
Position p1=new Position();
p1.setX(2.2); //自動裝箱向上轉型為Object
p1.setY(3.4);
double x1=(double)p1.getX(); //強轉向下轉為Double,然后自動拆箱為double
double y1=(Double)p1.getY();
System.out.println(x1+"、" + y1);
//假設位置是String類型
Position p2=new Position();
p2.setX("東經32"); //向上轉型為Object
p2.setY("北緯50");
String x2=(String)p2.getX(); //Object類向下轉型為一個具體的類String
String y2=(String)p2.getY();
System.out.println(x2+"、"+y2); //東經32、北緯50
}
}
如上,Object可以接收客戶端輸入的任意類型數據,但是也正是因為這個原因導致了一些問題:
Position p3=new Position();
p3.setX(3.4);
p3.setY("北緯50");
String x3=(String)p3.getX();
String y3=(String)p3.getY();
System.out.println(x3+"、"+y3);
為什么會有泛型?
上面代碼并不會明顯提示客戶端已經出現錯誤,但是運行時,會有運行時錯誤—數值轉換異常ClassCastException(兩個沒有關系的對象進行強轉出現的異常),我們就可以明顯看到,在Object向下轉型時會有不安全操作,為了避免這種不安全性,有了泛型。
泛型是什么?
泛型指的就是在類定義的時候并不會設置類中的屬性或方法中的參數的具體類型,而是在類使用時再進行定義。
泛型類:
泛型類指的是類在定義時并不設置類的屬性類型,而是在使用時再定義。
定義一個泛型類:
class Myclass
{
T vavule1;
}
表示類型參數,可以指代任意類型。一般會用大寫字母表示類型參數。
T 代表一般的類
E :泛型中類的屬性 elemen
K : key
V :Value ,常與K一起搭配使用
K/V 稱為鍵值對(間Map集合)
//使用泛型類,在使用時定義類類型
MyClass c1=new MyClass<>(); //后面的類型可以省
MyClass c2=new MyClass();
泛型只允許接受類,所有基本類型必須使用包裝類(看什么是引用類型)前面不可省,后面可省(JDK 1.7)
當然泛型類可以有多個泛型參數:
class MyClass //2個泛型參數
{
T value1;
E value2;
}
MyClass myClass1 = new MyClass();
引入泛型類后,對于Position類可以改為:
///用泛型類
class Position
{
private T x;
private T y;
public void setX(T x) {
this.x = x;
}
public void setY(T y) {
this.y = y;
}
public T getX() {
return x;
}
public T getY() {
return y;
}
}
public class T1
{
public static void main(String[] args)
{
Position p1=new Position<>(); //定義后類型參數T為String類
p1.setX(10);
p1.setY(20);
int x1=p1.getX(); //沒有強轉,這時T已經是String類
int y1=p1.getY(); //引入泛型后,避免了向下轉型
System.out.println(x1+"、"+y1);
Position p2=new Position<>();
p2.setX("東經32");
p2.setY("北緯50");
String x2=p2.getX();
String y2=p2.getY();
System.out.println(x2+"、"+y2);
}
}
并在引入泛型后,在使用類時定義類型,當類型定后,如果客戶端輸入的類型不對,會立即告訴用戶有錯,即強制用戶修改:
泛型類的優點:
1.避免向下轉型;
2.可是有效提醒用戶輸入錯誤(比如在輸入賬號時,如果用戶輸入字母,則會有賬號字符是數字,不是字母之類的提示)。
注:引入泛型后,如果明確設置了類型,則為設置類型;如果沒有設置類型,則默認為Object類型。
泛型方法
定義一個泛型方法:
public void MyMethod(T t)
{
System.out.println(t);
}
表示是泛型方法 沒有 則是普通方法
返回值是void 如果需要返回值是泛型,將void 改為T
泛型類和泛型方法共存:
class A
{
private T a;
private T b;
public T print1(T t) //泛型方法,泛型方法中泛型參數和泛型類的泛型參數沒有關系
{
System.out.println(t);
return t;
}
public void print2(T t) //普通方法
{
System.out.println(t);
}
}
public class T1 {
public static void main(String[] args)
{
A a1=new A();
a1.print2("pick"); //普通方法
int ret=a1.print1(10); //返回值是Integer,自動拆箱
//如果泛型方法 泛型參數是Integer,泛型類泛型參數是String,泛型類的泛型參數和泛型方法泛型方法無關
}
}
泛型類中的類型參數與泛型方法中的類型參數是沒有相應的聯系的,泛型方法始終以自己定義的類型參數為準。但是泛型類的類型參數和成員變量的類型保持一致。
編碼規范:泛型方法類型參數不要和泛型類的類型參數不要同名。
泛型接口:
定義一個泛型接口:
interface IA //泛型接口
{
public void func(T t);
}
子類實現接口有兩種方式:
子類繼續保持泛型
class A1Impl implements IA //前面表示是泛型類,后面T是接口泛型參數 兩個T是一樣的
{
}
子類在定義時確定好類型
class A2Impl implements IA //確定泛型參數為String
{
}
泛型接口具體實現:
interface IA //泛型接口
{
public void func(T t);
}
//子類繼續保持泛型
class A1Impl implements IA
{
public void func(T t)
{
System.out.println(t);
}
}
//子類在定義時確定好類型
class A2Impl implements IA
{
public void func(Integer data)
{
System.out.println(data);
}
}
public class T1 {
public static void main(String[] args)
{
IA a1=new A1Impl<>(); //子類繼續保持泛型
a1.func("hello");
IA a2=new A2Impl(); //子類定義時確定泛型參數
a2.func(10);
}
}
總結
以上是生活随笔為你收集整理的java 泛型接口 范型类 范型方法_泛型类、泛型方法、泛型接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java jcheckbox事件_JAV
- 下一篇: java 程序片段_20个非常有用的Ja