內(nèi)容
1.泛型簡(jiǎn)單介紹
2.類使用泛型
3.接口使用泛型
4.通配符
5.設(shè)置泛型上限和下限
6.泛型應(yīng)用之使集合自動(dòng)排序
一.泛型簡(jiǎn)單介紹
泛型這一塊在c++博客中寫過饱普,這里就不再引用虑瀑。因?yàn)榉盒驮诤笃诎沧块_發(fā)用的不多盆顾,所以只需掌握簡(jiǎn)單應(yīng)用即可酥筝。
1.用在哪
一般用于Collection和Map
2.何時(shí)用
在定義接口脱篙、類狰腌、方法和變量的時(shí)候僧鲁,需要操作數(shù)據(jù)虐呻,但是不清楚使用者需要哪種數(shù)據(jù)。這種情況下就需要使用泛型
3.注意點(diǎn)
①在定義的時(shí)候可以使用泛型來代表任意的類型寞秃,但是在使用的時(shí)候(定義變量斟叼、創(chuàng)建對(duì)象)必須要傳遞實(shí)際類型。
②泛型可以用E表示春寿,也可以用T表示朗涩。
二.類使用泛型
1.簡(jiǎn)單使用示例
class Test<E>{
}
主方法里面
Test<String> test;
new Test<String>();
當(dāng)創(chuàng)建對(duì)象的時(shí)候用了變量去保存對(duì)象了,這時(shí)候變量類型需要聲明具體類型绑改,但是new后面可以省略類型
Test<String> test2 = new Test();
2.泛型變量的應(yīng)用示例
class Test<E>{
E var1;
}
public class 測(cè)試程序 {
public static void main(String[] args) {
Test<String> test2 = new Test();
test2.var1 = "jack";
System.out.println(test2.var1.getClass());
}
}
結(jié)果
class java.lang.String
三.接口使用泛型
1.兩種使用方式
①明確用一個(gè)類實(shí)現(xiàn)接口谢床,進(jìn)而使用這個(gè)接口
②使用匿名內(nèi)部類使用這個(gè)接口
2.使用示例
//泛型接口
interface Test<T>{
void test(T t);
}
//類繼承一個(gè)接口時(shí)兄一,
//1.指定接口的類型
class test1 implements Test<String>{
@Override
public void test(String t) {
// TODO 自動(dòng)生成的方法存根
}
}
//2.指定當(dāng)前類為泛型
class test2<T> implements Test<T>{
@Override
public void test(T t) {
// TODO 自動(dòng)生成的方法存根
}
}
public class 測(cè)試程序 {
public static void main(String[] args) {
//一.明確用一個(gè)類實(shí)現(xiàn)接口,進(jìn)而使用這個(gè)接口
Test<String> test = new test2<String>();//test2后面的String可以省略
//二.使用匿名內(nèi)部類使用這個(gè)接口
Test<String> test3 = new Test<String>() {
@Override
public void test(String t) {
// TODO 自動(dòng)生成的方法存根
}
};
}
}
四.通配符
1.何時(shí)用
當(dāng)在使用泛型時(shí)识腿,如果不確定到底是什么類型出革,那么可以使用 ? 來表示任意類型渡讼,這個(gè)骂束?就是泛型。
但是真真正正使用的時(shí)候成箫,還是要指定確定類型展箱,不能直接一個(gè)?
2.泛型方法
當(dāng)方法所在的類不是泛型類的時(shí)候蹬昌,必須在方法前面(訪問權(quán)限修飾符后)使用<T>或者<E>來表示需要使用泛型
如果類是泛型類混驰,就不需要在方法前面指定了
2.使用示例(包括泛型方法的使用)
import java.util.*;
//泛型方法
//當(dāng)類不是泛型類的時(shí)候,必須在方法前面使用<T>或者<E>來表示需要使用泛型
//如果類是泛型類皂贩,就不需要在方法前面指定了
class Foo{
public<T> void test(T t) {
System.out.println(t);
}
//這里也用到了泛型栖榨,List是泛型接口,這里可以直接用List先紫,相當(dāng)于沒有指定類型
//這里也不能List<Object> ,因?yàn)镴ava的集合類型是不能自動(dòng)轉(zhuǎn)型的
//也就是List<Child> 的東西自動(dòng)轉(zhuǎn)到 List<Father>是不可以的
//即List<String>不能轉(zhuǎn)List<Object>
//但是按照規(guī)定筹煮,又需要指定類型遮精,所以就可以使用一個(gè)?
public void showList(List<?> list) {
for(int i = 0;i < list.size();i++) {
list.get(i);
System.out.println(list.get(i));
}
}
}
public class 測(cè)試程序 {
public static void main(String[] args) {
Foo foo = new Foo();
foo.test("jack");
ArrayList<String> names = new ArrayList<>();
names.add("merry");
names.add("john");
foo.test(names);
foo.showList(names);
}
}
結(jié)果
jack
[merry, john]
merry
john
3.注意點(diǎn)
Java的集合類型是不能自動(dòng)轉(zhuǎn)型的
五.設(shè)置泛型上限和下限
1.介紹
設(shè)置上限和下限其實(shí)涉及繼承败潦。就是雖然按照語法你可以隨意給我傳類型本冲,但是在實(shí)際情況中是有限制的。
比如小明要喝牛奶劫扒,你可以給他任意牛奶檬洞,比如蒙牛牛奶等等,但是最少你得是個(gè)牛奶沟饥,也就是你必須繼承(有可能直接繼承也有可能間接繼承)牛奶添怔,即上限是個(gè)牛奶。下限就是正常的牛奶牌子贤旷,比如各種正常品牌的牛奶广料,這都是可以的。但是下限幼驶、底線是這是能喝的艾杏,正常的健康的牛奶,不能瞎造一個(gè)就拿來喝盅藻,這是下限购桑。
2.上限設(shè)置使用示例
import java.util.*;
class Cat{
}
//設(shè)置泛型的上限 extends
interface IFood{
}
class Milk implements IFood{
}
class TianyouMilk extends Milk{
}
//上限是IFood畅铭,可以傳過來IFood,也可以是Milk勃蜘,也可以是TianyouMilk
class Student<T extends IFood>{//表示指定傳遞過來的類型的父類必須是IFood硕噩,或者其子類。
public void eat(T t) {
}
}
public class 測(cè)試程序 {
public static void main(String[] args) {
Student<Milk> xw ;
Student<TianyouMilk> zs;
//Student<Object> zt;//這樣就不行了
//Student<Cat> ca;//這樣依然不行
}
}
3.下限設(shè)置使用示例
//使用super來設(shè)置下限
class STest{
public<T> void copy(List<T> src,List<? super T> dest) {
//最少也得是T類型才能copy給我
}
}
六.泛型應(yīng)用之使集合自動(dòng)排序
1.功能介紹
之前的集合排序都是:先把數(shù)據(jù)傳進(jìn)去元旬,然后調(diào)用排序方法榴徐。那么可不可以改進(jìn)一下,使數(shù)據(jù)傳進(jìn)去就自動(dòng)排序了呢匀归?
答案是肯定的坑资,具體過程請(qǐng)看使用示例。
2.具體代碼
類① Person類
注意點(diǎn):
(1)實(shí)現(xiàn)Comparable接口
(2)重寫compareTo方法穆端,注意返回的值是如何表示的袱贮。
public class Person implements Comparable<Person>{
String name;
public Person(String name) {
this.name = name;
}
public String toString() {
return name;
}
@Override
public int compareTo(Person arg0) {
// TODO 自動(dòng)生成的方法存根
return name.compareTo(arg0.name);
}
}
類②SortList類
注意點(diǎn):
(1)這個(gè)類是自己創(chuàng)建的,繼承ArrayList体啰,所以有ArrayList的方法攒巍。
(2)因?yàn)橐獙?shí)現(xiàn)特定功能,所以要重寫add方法荒勇。
(3)注意第一個(gè)extends柒莉,這個(gè)表示這個(gè)泛型的上限必須是Comparable,對(duì)應(yīng)的Person類實(shí)現(xiàn)了Comparable接口
(4)沽翔? 后面的super表示兢孝?的下限是 T類型,因?yàn)槭荰要進(jìn)行比較仅偎,不能亂給我別的類型
import java.util.*;
//這個(gè)類的功能:
//在系統(tǒng)原有的基礎(chǔ)之上添加一個(gè)功能:一將數(shù)據(jù)加入數(shù)組跨蟹,就排好序
public class SortedList<T extends Comparable<? super T>> extends ArrayList<T>{
//添加數(shù)據(jù)就排好序
//1.先調(diào)用系統(tǒng)的方法
//2.把系統(tǒng)的add方法進(jìn)行重寫
/** public boolean add(T t) {
return super.add(t);
}**/
public boolean add(T t) {
//將數(shù)據(jù)排序
boolean result = super.add(t);
//對(duì)數(shù)組排序
Collections.sort(this);
//返回結(jié)果
return result;
}
}
類③主方法所在類
注意點(diǎn):這里直接使用自己寫的類創(chuàng)建集合即可。
import java.util.*;
public class 測(cè)試程序 {
public static void main(String[] args) {
SortedList<Person> lists = new SortedList<Person>();
lists.add(new Person("jack"));
lists.add(new Person("black"));
lists.add(new Person("merry"));
System.out.println(lists);
}
}
結(jié)果
[black, jack, merry]
總結(jié)
前幾天以為沒有課程橘沥,就沒聽課窗轩,到昨天才發(fā)現(xiàn)課程一直在更新,所以就有點(diǎn)尷尬座咆。但是還是不要慌痢艺,落下的部分慢慢去學(xué),這一遍一定要學(xué)透徹〗樘眨現(xiàn)在有兩個(gè)demo腹备,一個(gè)是撲克牌的,一個(gè)是聯(lián)系人的斤蔓,雖然寫完了植酥,但是還沒有著手研究。我一定會(huì)抽時(shí)間寫出來的。