java 通配符 类_关于类:具有多个类的Java泛型通配符
我想要一個類對象,但是我想要強制它所代表的任何類來擴展類A和實現接口B。
我能做到:
Class extends ClassA>
或:
Class extends InterfaceB>
號
但我不能兩者兼得。有辦法嗎?
實際上,你可以做你想做的。如果要提供多個接口或類加接口,則必須使通配符看起來像這樣:
請參閱sun.com上的generics教程,特別是頁面底部的綁定類型參數部分。如果您愿意的話,您實際上可以列出多個接口,為您需要的每個接口使用& InterfaceName。
這會變得任意復雜。要演示,請參見Collections#max的javadoc聲明,它(包裝在兩行中)是:
public static > T
max(Collection extends T> coll)
號
為什么這么復雜?正如Java泛型常見問題解答:保存二進制兼容性。
看起來這對變量聲明不起作用,但在類上放置泛型邊界時,它起作用。因此,要想做你想做的事,你可能需要跳過幾個圈。但你可以做到。您可以這樣做,在類上放置一個通用邊界,然后:
class classB { }
interface interfaceC { }
public class MyClass {
Class variable;
}
得到有你想要的限制的variable。有關更多信息和示例,請查看Java 5中泛型的第3頁。注意,在中,類名必須在前面,接口在后面。當然,你只能列出一個類。
但是為什么我要在返回對象時把它投射到t上呢?
@在我回答之前,你需要提供更多的信息。在什么情況下你需要演員?
這很有幫助。值得一提的是,類必須排在第一位,您不能說""。
也可以用逗號分隔,但只能用類分隔。
對于T,如何做同樣的事情?應該擴展一個類或者實現一個接口?
@Ragunathjawahar:你不能對此過于開放。你必須有一些邊界,其中之一就是提前知道你將在哪里有接口,在哪里有類,以及你將如何使用繼承。對于類型參數,您幾乎必須知道它是類還是接口。
@埃迪,你說得對。我知道了。它對于不同的用例是不同的。我最終用一種通用方法解決了我的問題。基類使用超級類指定邊界。其中一個泛型方法通過擴展基類和接口縮小了范圍。
T extends Object部分的用途是什么?
@中卓:在這種情況下,可能會有幾個班,為什么他們會被昏迷分開?
@njzk2:檢查我在回答中對"保持二進制兼容性"的鏈接。它解釋了為什么"T擴展對象"部分在那里。
@埃迪:謝謝,我現在明白了。
回答的第一行是"讓通配符看起來像這樣",表達式中沒有?,所以它真的是一個"通配符"?我這樣問是因為當類型參數實際上是一個通配符時,我不能讓整個"一次擴展兩件事"概念起作用。
是的,它不是一個真正的通配符,你不能用一個通配符來做OP要求的事情。你可以做什么操作,有效地,只是不使用通配符。
很有趣,但您不能(表面上)做的是,因為1)類型參數必須在"&;"中位于最后,2)即使在該形式中,它也會生成"意外類型"。
不能使用"匿名"類型參數(即使用?的通配符),但可以使用"命名"類型參數。只需在方法或類級別聲明類型參數。
import java.util.List;
interface A{}
interface B{}
public class Test> {
T t;
}
。
為什么不允許使用通配符?也就是說,我不明白為什么這不應該是有效的:arraylistList;然后,如果從列表中拉出一個元素,則可以將其分配給ClassA或InterfaceB類型的變量。
用變量替換通配符是一種很好的技術!但并不總是有效。例如,Java不允許注釋值類型中的名稱類型變量,但它允許通配符。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java 通配符 类_关于类:具有多个类的Java泛型通配符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 注解妙用_框架开发之Java注
- 下一篇: 网站假设php,PHP个人网站架设连环讲