在Java中,泛型extends
關(guān)鍵字主要有以下應(yīng)用場(chǎng)景:
extends
關(guān)鍵字。這可以確保類(lèi)型安全,并避免在運(yùn)行時(shí)出現(xiàn)ClassCastException
。public class GenericBox<T extends Number> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
在這個(gè)例子中,GenericBox
類(lèi)接受一個(gè)泛型參數(shù)T
,它必須是Number
類(lèi)的子類(lèi)。這樣,你可以創(chuàng)建一個(gè)GenericBox
對(duì)象來(lái)存儲(chǔ)任何類(lèi)型的數(shù)字,但不能存儲(chǔ)非數(shù)字類(lèi)型。
2. 限制泛型參數(shù)的上界:當(dāng)你希望一個(gè)泛型參數(shù)不能是某個(gè)類(lèi)的實(shí)例,但可以繼承自該類(lèi)或其子類(lèi)時(shí),可以使用extends
關(guān)鍵字。這與super
關(guān)鍵字相對(duì),后者用于限制下界。
public class UpperBoundedGeneric<T extends MyBaseClass> {
// ...
}
在這個(gè)例子中,UpperBoundedGeneric
類(lèi)接受一個(gè)泛型參數(shù)T
,它必須是MyBaseClass
類(lèi)的子類(lèi)。
3. 實(shí)現(xiàn)多態(tài)性:通過(guò)使用extends
關(guān)鍵字,你可以編寫(xiě)更加靈活和可重用的代碼。當(dāng)你希望一個(gè)方法能夠處理多個(gè)類(lèi)型時(shí),這些類(lèi)型都是某個(gè)基類(lèi)的子類(lèi),你可以使用泛型方法來(lái)實(shí)現(xiàn)這一點(diǎn)。
public class MyClass<T extends MyBaseClass> {
public void doSomething(T item) {
// ...
}
}
在這個(gè)例子中,MyClass
類(lèi)有一個(gè)泛型方法doSomething
,它接受一個(gè)類(lèi)型為T
的參數(shù),其中T
必須是MyBaseClass
類(lèi)的子類(lèi)。這樣,你可以創(chuàng)建一個(gè)MyClass
對(duì)象來(lái)處理任何類(lèi)型的MyBaseClass
子類(lèi)實(shí)例。
4. 與類(lèi)型參數(shù)一起使用extends
:在某些情況下,你可能希望同時(shí)使用類(lèi)型參數(shù)和extends
關(guān)鍵字來(lái)進(jìn)一步限制泛型參數(shù)的類(lèi)型范圍。
public class MyGenericClass<T extends Number & Comparable<T>> {
// ...
}
在這個(gè)例子中,MyGenericClass
類(lèi)接受一個(gè)泛型參數(shù)T
,它必須是Number
類(lèi)的子類(lèi)并且實(shí)現(xiàn)了Comparable<T>
接口。這可以確保T
類(lèi)型具有數(shù)字特性和可比較性。
總之,Java中的泛型extends
關(guān)鍵字允許你限制泛型參數(shù)的類(lèi)型范圍,實(shí)現(xiàn)多態(tài)性,并編寫(xiě)更加靈活和可重用的代碼。