2012-12-31 45 views
2

是可能的代碼綁定爲一個泛型參數:通用下界對象

public <T super Object> void someMethod(T t); 

是否有這樣的約束的有效使用?

+0

你確定這是有效的語法嗎?我在Eclipse中遇到語法錯誤。 –

+0

'令牌「超級」語法錯誤,expected'是我得到 –

+0

注:我寫了這個問題,在我的iPhone,沒有編譯器方便 - 它不會編譯。 – Bohemian

回答

2

按照JLS http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4類型參數(該<Ť延伸對象>術語)包括選自:

TypeParameter: 
    TypeVariable TypeBound* 

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType AdditionalBoundList* 

AdditionalBoundList: 
    AdditionalBound AdditionalBoundList 
    AdditionalBound 

AdditionalBound: 
    & InterfaceType 

* =可選

你看TypeBound,僅存在的使用指定了extends。 不幸的是,未指定使用super的下限類型參數。下限僅在使用通配符(JLS#4.5.1

好問題,讓我在JLS挖那個指定的,我不知道爲什麼這不是Java實現的,只是沒有指定。

1

這樣一個較低的債券是完全沒用的。如果你想有一個只能接受Object的模板,你只需要使用Object作爲你的類型直接刪除所有的通用模板和代碼。

對於Object以外的其他類型,它也沒有任何意義。你爲什麼想要一個能夠接受類型A的對象或沒有類型A的對象(例如對象)的模板,但是當B是A的子類時,它會拒絕類型B的對象?這完全不合邏輯。

同樣的想法與接口:你會接受任何類型的沒有實現一個接口,在我全部或者實現它,但你會拒絕一個類型,不僅有我,但已經擴展它的界面???