編輯在Java的泛型任何方式:我改了一下的例子用於獲取想法:有模仿或
像
<Integer or Float>
...而無需創建一個通用的接口,使對於整型和浮點型的子類來實現它
如果沒有,像這樣的,也許有更多的意義和有用
<E extends Number> <E = (Integer|Float)>
如果?是通配符,爲什麼我們不應該允許限制某些類型?
編輯在Java的泛型任何方式:我改了一下的例子用於獲取想法:有模仿或
像
<Integer or Float>
...而無需創建一個通用的接口,使對於整型和浮點型的子類來實現它
如果沒有,像這樣的,也許有更多的意義和有用
<E extends Number> <E = (Integer|Float)>
如果?是通配符,爲什麼我們不應該允許限制某些類型?
這是不可能的,我幾乎看不到任何價值。您使用泛型來限制類型,例如在收藏。通過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>
這是非常合情合理的 - 你可以使用在需要或者Serializable
或Closeable
E
類型的變量。換言之,E
必須同時延伸Serializable
和Closeable
。另見:Java Generics Wildcarding With Multiple Classes。
好的列表是愚蠢的,但對於其他用途,它可能不是這樣的。即使你可以有一個String a = list.get(0)或者一個Integer a = list.get(0),醜陋但並非不可能或不實用。如果錯誤 – Whimusical 2012-07-24 14:51:28
@ user1352530:它可能會拋出CastExeption:避免'ClassCastException'和編譯時類型檢查是首先包含泛型的原因之一。 – 2012-07-24 14:53:54
我更新了一個新的問題,讓我也一樣 – Whimusical 2012-07-24 14:55:30
我沒有看到它的真正用途......但無論如何,我相信最接近它的是爲可能的實現擴展通用接口。
在非常極端的情況下(Java 7之前沒有AutoCloseable
),我也希望能夠做到這一點。例如。
<E extends Connection or Statement or ResultSet>
那會已經允許我叫E.close()
,無論實際類型是什麼。換句話說,E
將包含所有提供類型的「API交集」。在這種情況下,它將包含close()
以及來自java.sql.Wrapper
和java.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) { //...
或修復你的設計,你可能不應該有反正
在Java 7中,所有這些類都實現了['AutoCloseable'](http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html),所以'
'
@TomaszNurkiewicz:我知道。這只是一個例證。 @GriffeyDog:看到托馬斯的答案。 JDBC類型擴展了'AutoCloseable',而不是'Closeable'(它也擴展了'AutoCloseable') – 2012-07-24 15:05:11
你爲什麼要這樣對相交任意類型的API? – Pshemo 2012-07-24 14:45:02
他們看起來像粉筆和奶酪。這個要求對我來說根本沒有意義。字符串像Numbers一樣的數學實體在某些操作中是否已關閉?我以爲不是。 – duffymo 2012-07-24 14:46:20
準確地說,因爲字符串是最終的,所以還是需要更多的解決方案,因爲我們無法通過替代方案來解決問題。我建議 – Whimusical 2012-07-24 14:48:57