私はJavaで書かれた次のインターフェイスメソッドの定義があります。
<T extends View & ISpecificView> T getSpecificView();
Javaベースの消費者のコードは、単にそれを呼び出すことによって、この方法で動作して延びるオブジェクトとして返された値を処理することができるView
クラスを実装し、ISpecificView
以下のようにインタフェースを:
getContainer().getSpecificView().whateverTclassMethod()
Kotlin Iで同じコードを呼び出すためにしようとすると取得Type inference failed: Not enough information to infer parameter T (...) Please specify it explicitly
でエラーgetSpecificView()
方法を。それは、任意の祖先かもしれないので、私は明示的にタイプを提供してみたいが、私は、任意の特定のクラスを渡すことができないよView
実装するクラスISpecificView
のインターフェイス。いずれかの単一の受け渡しView
やISpecificView
ヘルプにはない-それは、その結果Type argument is not within its bounds. Expected: View! Found ICustomView
、逆もまた同様です。
Javaのと同等に合格するためにあらゆる可能性があるT extends View & ISpecificView
、私はそれを利用することができるので、メソッドの呼び出し中にKotlinには?
(と私は右の質問を得た願っています!)要約すると、Javaであなたが行うことができます
final View view = getContainer().getSpecificView(); // or
final ISpecificView iview = getContainer().getSpecificView();
Kotlinには同じこと
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()
固有のキャストView
やは、ISpecificView
あなただけ行う場合ので、必要とされます
getContainer().getSpecificView<KView>()
あなたが買ってあげます
class your.package$ExtendingClass cannot be cast to class your.package.KView
それのは完全に罰金です。
でも、Javaで、あなたがしたいかどうかを判断する必要がありますView
かISpecificView
。
この方法は、あなたはすべての方法を操作することができるでしょうView
かISpecificView
。
本当に、私がしようとする他に何かわかりません。ホープ誰かが何か良いを思い付きます。
編集:何を意味するあなたがJavaである場合
final ExtendedView ev = getContainer().getSpecificView();
あなたは戻り値の型が実際に保証することはできませんとしても、これは、それがコンパイルしても、少し間違っ私見ですExtendedView
。あなたはそれが延びて確実に知るView
と実装ISpecificView
。