泛型介面
Prerequisites:
語法
在類別名後面,用尖括號包住<自訂類型>。
自訂類型可用T, R, K, V 任意一個大寫字母。
1
2
interface 介面名<T, R, M> {
}
抽象方法
介面中的方法都是抽象。
1
2
3
4
interface IMove<T, R, M> {
R doMove(M m);
void move(T t1, T t2, R r1, M m1);
}
繼承時要指定泛型類型
以下程式碼,IFly繼承IMove時,要指定泛型類型Integer, String, Object,才能繼承。
1
2
3
4
5
6
7
8
interface IMove<T, R, M> {
R doMove(M m);
void move(T t1, T t2, R r1, M m1);
}
interface IFly extends IMove<Integer, String, Object> {
}
Duck實作IFly繼承下來的抽象方法,會自動替換類型,T, R, M 替換成 Integer, String, Object。
實作抽象方法。
選取要實作的抽象方法,按ok。
方法中的類型被自動填寫。
1
2
3
4
5
6
7
8
9
10
11
12
class Duck implements IFly {
@Override
public String doMove(Object o) {
return null;
}
@Override
public void move(Integer t1, Integer t2, String r1, Object m1) {
}
}
實作時要指定泛型類型
泛型介面
1
2
3
interface ISwim<T, R, M> {
void swim(T t1, T t2, R r1, M m1);
}
實作時要指定介面的泛型類型。
1
2
3
4
5
6
7
class Fish implements ISwim<Object, Character, String> {
@Override
public void swim(Object t1, Object t2, Character r1, String m1) {
}
}
沒指定泛型類型,預設用Object
潛水艇(Submarine)類別實作ISwim沒指定泛型類型,預設泛型類型為Object,所以swim方法的參數類型全部都是Object。
1
2
3
4
5
6
class Submarine implements ISwim {
@Override
public void swim(Object t1, Object t2, Object r1, Object m1) {
}
}
上面的程式碼與下面的程式碼是相同意思。
1
2
3
4
5
6
class Submarine implements ISwim<Object, Object, Object> {
@Override
public void swim(Object t1, Object t2, Object r1, Object m1) {
}
}
不能使用泛型的情況
不能用靜態static
以下為其它筆記。
泛型介面主要用途在於檢查介面的類型是否正確。
語法
interface 介面名後面有一對<>
尖括號,尖括號包著的是泛型T。
1
2
interface 介面名<T> {
}
T,代表什麼類型都可以,除了基本類型(int, float, double …)之外。
1
2
3
interface Listen<T> {
void listen(T obj);
}
使用泛型介面
類別實作泛型介面,要指定型別。
Listen泛型介面
1
2
3
interface Listen<T> {
void listen(T obj);
}
Piano
1
2
3
4
5
class Piano {
void play() {
System.out.println("Piano play");
}
}
Guitar
1
2
3
4
5
class Guitar {
void play() {
System.out.println("Guitar play");
}
}
一般類別實作泛型介面要指定類型。
1
2
3
4
5
6
class Student implements Listen<Piano> {
@Override
public void listen(Piano obj) {
obj.play();
}
}
一般類別實作泛型介面要指定類型。
1
2
3
4
5
6
class Teacher implements Listen<Guitar> {
@Override
public void listen(Guitar obj) {
obj.play();
}
}
測試
1
2
3
4
5
6
7
8
9
10
public class Test {
public static void main(String[] args) {
Student student = new Student();
// 只能放Piano,不然會出錯
student.listen(new Piano());
Teacher teacher = new Teacher();
teacher.listen(new Guitar());
}
}
Piano play
Guitar play