2012-07-24 50 views
5

編輯在Java的泛型任何方式:我改了一下的例子用於獲取想法:有模仿或

<Integer or Float> 

...而無需創建一個通用的接口,使對於整型和浮點型的子類來實現它

如果沒有,像這樣的,也許有更多的意義和有用

<E extends Number> <E = (Integer|Float)> 

如果?是通配符,爲什麼我們不應該允許限制某些類型?

+1

你爲什麼要這樣對相交任意類型的API? – Pshemo 2012-07-24 14:45:02

+0

他們看起來像粉筆和奶酪。這個要求對我來說根本沒有意義。字符串像Numbers一樣的數學實體在某些操作中是否已關閉?我以爲不是。 – duffymo 2012-07-24 14:46:20

+0

準確地說,因爲字符串是最終的,所以還是需要更多的解決方案,因爲我們無法通過替代方案來解決問題。我建議 – Whimusical 2012-07-24 14:48:57

回答

10

這是不可能的,我幾乎看不到任何價值。您使用泛型來限制類型,例如在收藏。通過or運算符,您可以儘可能多地瞭解這兩種類型的最具體的超類型,例如Object。那麼爲什麼不使用Object

假設:

List<E extends String or Number> list = //... 

什麼是list.get(0)類型?是String還是Number?但是你不能有這種類型的變量。它不能是String,它不能是Number - 它只能是... Object

更新:既然你有問題改變了你的例子:

<Integer or Float> 

爲什麼你不只是說:

<Number> 

?請注意,Number的方法可讓您輕鬆提取floatValue()intValue()。你真的需要確切的類型嗎?


請注意,您可以使用操作and

<E extends Serializable & Closeable> 

這是非常合情合理的 - 你可以使用在需要或者SerializableCloseableE類型的變量。換言之,E必須同時延伸SerializableCloseable。另見:Java Generics Wildcarding With Multiple Classes

+0

好的列表是愚蠢的,但對於其他用途,它可能不是這樣的。即使你可以有一個String a = list.get(0)或者一個Integer a = list.get(0),醜陋但並非不可能或不實用。如果錯誤 – Whimusical 2012-07-24 14:51:28

+2

@ user1352530:它可能會拋出CastExeption:避免'ClassCastException'和編譯時類型檢查是首先包含泛型的原因之一。 – 2012-07-24 14:53:54

+0

我更新了一個新的問題,讓我也一樣 – Whimusical 2012-07-24 14:55:30

1

我沒有看到它的真正用途......但無論如何,我相信最接近它的是爲可能的實現擴展通用接口。

5

在非常極端的情況下(Java 7之前沒有AutoCloseable),我也希望能夠做到這一點。例如。

<E extends Connection or Statement or ResultSet> 

那會已經允許我叫E.close(),無論實際類型是什麼。換句話說,E將包含所有提供類型的「API交集」。在這種情況下,它將包含close()以及來自java.sql.Wrapperjava.lang.Object的所有方法。

但不幸的是,你不能這樣做。相反,使用方法重載,例如

void close(Connection c); 
void close(Statement s); 
void close(ResultSet r); 

或純老instanceof

if (obj instanceof Connection) { 
    ((Connection) obj).close(); 
} 
else if (obj instanceof Statement) { //... 

或修復你的設計,你可能不應該有反正

+1

在Java 7中,所有這些類都實現了['AutoCloseable'](http://docs.oracle.com/javase/7/docs/api/java/lang/Au​​toCloseable.html),所以''現在是足夠。 – 2012-07-24 15:02:36

+0

''? – GriffeyDog 2012-07-24 15:03:04

+0

@TomaszNurkiewicz:我知道。這只是一個例證。 @GriffeyDog:看到托馬斯的答案。 JDBC類型擴展了'AutoCloseable',而不是'Closeable'(它也擴展了'AutoCloseable') – 2012-07-24 15:05:11