亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Kotlin 中調用具有泛型類型的方法,并具有多個參數類型約束

在 Kotlin 中調用具有泛型類型的方法,并具有多個參數類型約束

阿晨1998 2022-09-14 17:42:13
我用Java編寫了以下接口方法定義:<T extends View & ISpecificView> T getSpecificView();基于 Java 的使用者代碼只需調用此方法即可對此方法進行操作,并將返回的值視為擴展類并按以下方式實現接口的對象:ViewISpecificViewgetContainer().getSpecificView().whateverTclassMethod()嘗試在 Kotlin 中調用相同的代碼,我在方法上得到錯誤。我很想顯式提供該類型,但我無法傳遞任何特定的類,因為它可能是實現接口的類的任何祖先。通過單一或無濟于事 - 它會導致,反之亦然。Type inference failed: Not enough information to infer parameter T (...) Please specify it explicitlygetSpecificView()ViewISpecificViewViewISpecificViewType argument is not within its bounds. Expected: View! Found ICustomView在調用方法時,是否有可能傳遞與Kotlin中的Java等效的Java,以便我可以使用它?T extends View & ISpecificView
查看完整描述

2 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

回顧一下(我希望我答對了這個問題!),在Java中你可以做到


final View view = getContainer().getSpecificView();  // or

final ISpecificView iview = getContainer().getSpecificView();

在科特林,同樣的事情


val view: View = getContainer().getSpecificView()

結果Type inference failed: Not enough information to infer parameter T


經過50分鐘的嘗試和嘗試...

只是創建一個假人(摘要?class


abstract class KView : View(), ISpecificView

并使用它來顯式設置泛型返回類型


val view: View = getContainer().getSpecificView<KView>()

view.whateverClassMethod()


val iview: ISpecificView = getContainer().getSpecificView<KView>()

iview.whateverInterfaceMethod()


// or just


(getContainer().getSpecificView<KView>() as View).whateverClassMethod()

(getContainer().getSpecificView<KView>() as ISpecificView).whateverInterfaceMethod()

需要對 or 進行特定強制轉換,因為如果您只是這樣做ViewISpecificView


getContainer().getSpecificView<KView>()

你會得到


class your.package$ExtendingClass cannot be cast to class your.package.KView

但這完全沒問題。

即使在Java中,您也需要決定是想要一個還是一個.ViewISpecificView


這樣,您就可以對 或 的所有方法進行操作。ViewISpecificView


真的,我不知道還能嘗試什么。希望有人想出更好的東西。


編輯:如果你的意思是在Java中,你做


final ExtendedView ev = getContainer().getSpecificView();

好吧,恕我直言,這有點錯誤,即使它編譯了,因為您不能保證返回類型是真的 。您只是確定它擴展和實現。ExtendedViewViewISpecificView


查看完整回答
反對 回復 2022-09-14
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

您應該能夠使用以下方法實現此目的:

fun <T> getSpecificView() where T : View, T : ISSpecificView {}

在此處找到相關文檔。


查看完整回答
反對 回復 2022-09-14
  • 2 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號