2 回答

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
添加回答
舉報