タイプパラメータを指定せずにメソッドを呼び出すサブクラスを持つ汎用パラメータを持つ抽象クラスを作成しようとしています。 私はこれまでのところ、これを持っている:汎用パラメータを持つ抽象クラスと型パラメータを使用するメソッド
abstract class AbstractClass<T : Any> @Autowired constructor(protected val delegate: MyService) {
inline fun <T: Any> myMethod(param: Any): T? {
return delegate.myMethod(param).`as`(T::class.java)
}
}
と実装:私は型引数を指定する必要がmyMethod
を呼び出すとき
class TesterWork @Autowired constructor(delegate: MyService) : AbstractClass<Tester>(delegate) {
}
は今:
testerWork.myMethod<Tester>("test")
私はそれが可能だろうと思いまして型引数を自動的に推論するか? 私は何とかmyMethodを再加工できますか?メソッド内にT::class.java
が必要であることに注意してください。
ありがとうございました!私は、なぜジェネリックparamをメソッドgenericパラムに接続できないのか、少し困惑しています。サブクラスが作成されると、ジェネリック型がわかります。なぜ抽象クラスの "T型"として使用できないのですか?なぜ型を指定しなければならないのでしょうか? – NikolaB
@ NikolaB、**両方のクラスとそのメソッドにジェネリックパラメータを追加すると、それらは互いに接続されていない別のパラメータになります。それ以外の場合は、関数内でクラスのgenericパラメータを使用することができます。抽象クラスに関しては、JVMのジェネリックスは異なる方法で動作します。メソッドコードは派生クラスごとに複製されないため、派生クラスのジェネリックパラメータの代わりに具体的な型を指定することは役に立ちません。メソッドのコードはそれでも基本クラスでは、ジェネリックはそれから消去されます。 – hotkey
@NikolaB、おそらく読んでいる* https://en.wikipedia.org/wiki/Generics_in_Javaのタイプ消去のセクション*の問題は、物事をより明確にするでしょう。 – hotkey