江西網(wǎng)站備案流程全網(wǎng)推廣怎么做
文章目錄
- 1、泛型
- 1.1、為什么要使用泛型?
- 1.2、泛型的應用
- 1.3、泛型通配符
- 1.4、泛型上限和下限
- 1.5、泛型接口
- 2、枚舉
1、泛型
Generics 是指在定義類的時候不指定類中某個信息(屬性/方法返回值)的具體數(shù)據(jù)類型,而是用一個標識符來替代,當外部實例化對象的時候再來指定具體的數(shù)據(jù)類型。
集合和數(shù)組相比較,優(yōu)勢在于長度可以隨時改變,集合中存儲的數(shù)據(jù)類型是靈活的,不固定。
1.1、為什么要使用泛型?
使用泛型可以確保集合中數(shù)據(jù)的統(tǒng)一性,同時它又兼具很好的靈活性
package com.htl.test;import java.util.ArrayList;public class Test3 {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList();list.add(1);list.add(2);for (int i = 0; i < list.size(); i++) {int num = list.get(i);System.out.println(num);}}
}
1.2、泛型的應用
在自定義類中添加泛型,基本語法
public class 類名<泛型標識1,泛型標識2...>{private 泛型標識1 id;public 泛型標識2 test(){return (泛型標識2) new Object();}
}
自定義一個表示時間的類 Time
package com.htl.test;public class Time<T> {private T value;public T getValue() {return value;}public void setValue(T value) {this.value = value;}
}
package com.htl.test;public class Test4 {public static void main(String[] args) {Time<Integer> time1 = new Time<>();time1.setValue(10);System.out.println("現(xiàn)在的時間是" + time1.getValue());Time<String> time2 = new Time<>();time2.setValue("十點");System.out.println("現(xiàn)在的時間是" + time2.getValue());}
}
package com.htl.test;public class Test5 {public static void main(String[] args) {Time2<String,Integer,Float> time = new Time2<>();time.setHour("十點");time.setMinute(10);time.setSeconde(10.0f);System.out.println("現(xiàn)在的時間是" + time.getHour() + ":" + time.getMinute() + ":" + time.getSeconde());}
}
package com.htl.test;public class Time2<H,M,S> {private H hour;private M minute;private S seconde;public H getHour() {return hour;}public void setHour(H hour) {this.hour = hour;}public M getMinute() {return minute;}public void setMinute(M minute) {this.minute = minute;}public S getSeconde() {return seconde;}public void setSeconde(S seconde) {this.seconde = seconde;}
}
靜態(tài)成員不能用泛型來修飾,非靜態(tài)成員變量可以用泛型。
靜態(tài)成員變量在類加載的時候就存入到內(nèi)存中了,沒有類型,所以無法存入,就不能定義為靜態(tài)的。
靜態(tài)方法可以使用泛型
private static Object hour;
public static<H> H getHour() {return (H)hour;
}
1.3、泛型通配符
String 和 Integer 在泛型引用中不能轉(zhuǎn)換為 Object,多態(tài)在泛型引用中不生效
package com.htl.test2;import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<String> list1 = new ArrayList<>();test(list1);ArrayList<Integer> list2 = new ArrayList<>();test(list2);}/*** 既可以傳入String類型的集合* 也可以傳入Integer類型的集合*/public static void test(ArrayList<?> list){}}
1.4、泛型上限和下限
使用泛型的時候可以通過泛型上限和下限對數(shù)據(jù)類型的范圍進行擴充
泛型上限
表示實例化時的具體數(shù)據(jù)類型,可以是上限類型的子類或者上限類型本身,用 extends 關(guān)鍵字來修飾。
泛型下限
表示實例化時的具體數(shù)據(jù)類型,可以是下限類型的父類或者下限類型本身,用 super 關(guān)鍵字來修飾。
基本語法:
泛型上限:類名<泛型標識符 extends 上限類名>
泛型下限:類名<泛型標識符 super 下限類名>
package com.htl.test2;public class Time<T> {public static void main(String[] args) {test(new Time<Number>());test(new Time<Byte>());test(new Time<Integer>());test2(new Time<String>());test2(new Time<Object>());}/*** 參數(shù)的泛型只能是Number或者它的子類,Number、Byte、short、Integer...*/public static void test(Time<? extends Number> time){}/*** 參數(shù)的泛型只能是String或者它的父類,String和Object*/public static void test2(Time<? super String> time){}
}
1.5、泛型接口
我們在定義類的時候可以使用泛型,定義接口的時候同樣可以使用泛型。
public interface MyInterface<T>{public T getValue();
}
實現(xiàn)泛型接口有兩種方式,一種是實現(xiàn)類在定義時繼續(xù)使用泛型標識,另一種時實現(xiàn)類在定義時直接給出具體的數(shù)據(jù)類型。
1、實現(xiàn)類繼續(xù)使用泛型
package com.htl.test3;public class MyImplement<T> implements MyInterface<T> {private T obj;public T getObj() {return obj;}public void setObj(T obj) {this.obj = obj;}@Overridepublic T getValue() {return null;}
}
2、實現(xiàn)類給出具體的數(shù)據(jù)類型
package com.htl.test3;public class MyImplement2 implements MyInterface<String> {private String obj;public String getObj() {return obj;}public void setObj(String obj) {this.obj = obj;}@Overridepublic String getValue() {return null;}
}
實現(xiàn)類繼續(xù)使用泛型,在具體實例化的時候需要給出具體的數(shù)據(jù)類型。
實現(xiàn)類給出具體的數(shù)據(jù)類型,在具體實例化的時候不需要給出具體的數(shù)據(jù)類型。
package com.htl.test3;public class Test {public static void main(String[] args) {MyImplement<String> myInterface = new MyImplement<>();MyImplement2 myInterface1 = new MyImplement2();}
}
2、枚舉
Enum 是一種有確定取值區(qū)間的數(shù)據(jù)類型,本質(zhì)上就是一個類,簡潔、安全、方便。
枚舉的值被約束到一個特定的范圍,只能從這個范圍內(nèi)取值。
package com.htl.test3;public enum WeekEnum {MONDAY,TUESDAY,WEDENSDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
package com.htl.test3;public enum ResponseEnum {SUCCESS(0,"成功"),ERROR(-1,"失敗");private Integer code;private String msg;public Integer getCode() {return code;}public String getMsg() {return msg;}ResponseEnum(Integer code, String msg) {this.code = code;this.msg = msg;}
}
package com.htl.test3;public class Test2 {public static void main(String[] args) {System.out.println(ResponseEnum.SUCCESS.getCode());System.out.println(ResponseEnum.ERROR.getMsg());}
}