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