Generics 具有参数化返回类型的Kotlin函数具体化参数

Generics 具有参数化返回类型的Kotlin函数具体化参数,generics,kotlin,kotlin-reified-type-parameters,Generics,Kotlin,Kotlin Reified Type Parameters,我使用一个内部Java框架,其中包含以下类(为了演示而简化): 公共接口操作{ R运行(T); } 公共类具体操作实现了一些操作{ @凌驾 公共字符串运行(整数参数){ 返回“abc”; } } 公共类操作工厂{ public SomeAction create(类clz)抛出IllegaccessException、InstanceionException{ 返回clz.newInstance(); } } 以java方式从Kotlin调用工厂方法可以正常工作: ActionFactory(

我使用一个内部Java框架,其中包含以下类(为了演示而简化):

公共接口操作{
R运行(T);
}
公共类具体操作实现了一些操作{
@凌驾
公共字符串运行(整数参数){
返回“abc”;
}
}
公共类操作工厂{
public SomeAction create(类clz)抛出IllegaccessException、InstanceionException{
返回clz.newInstance();
}
}
以java方式从Kotlin调用工厂方法可以正常工作:

ActionFactory().create(ConcreteAction::class.java).run(1)
然后,我创建了以下扩展方法,使其更加简洁:

    inline fun <reified A : SomeAction<T, R>, T, R> ActionFactory.create(): SomeAction<T, R> {
        return create(A::class.java)
    }
inline fun ActionFactory.create():SomeAction{
返回create(A::class.java)
}
但是调用
ActionFactory().create().run(1)
失败,错误为
3个内联fun的类型参数…


有没有办法让它在不接触java代码的情况下工作?

Kotlin不允许在只指定部分类型参数的情况下调用泛型函数。如果要使用显式类型参数调用
create
,则必须指定所有三个参数:

ActionFactory().create<ConcreteAction, Int, String>().run(1)
ActionFactory().create().run(1)

Kotlin不允许在仅指定部分类型参数时调用泛型函数。如果要使用显式类型参数调用
create
,则必须指定所有三个参数:

ActionFactory().create<ConcreteAction, Int, String>().run(1)
ActionFactory().create().run(1)

注意:这可能不适用于实际代码,具体取决于您简化的内容。但是考虑到这种设置,可以合理地假设
create
的返回值实际上是
A
的一个实例,在这种情况下

inline fun <reified A : SomeAction<*, *>> ActionFactory.create(): A {
    return create(A::class.java) as A
}

ActionFactory().create<ConcreteAction>().run(1)
inline-fun-ActionFactory.create():A{
返回create(A::class.java)作为
}
ActionFactory().create().run(1)

会有用的。如果你这样做的话,应该记录假设并添加测试

注意:这可能不适用于实际代码,具体取决于您简化的内容。但是考虑到这种设置,可以合理地假设
create
的返回值实际上是
A
的一个实例,在这种情况下

inline fun <reified A : SomeAction<*, *>> ActionFactory.create(): A {
    return create(A::class.java) as A
}

ActionFactory().create<ConcreteAction>().run(1)
inline-fun-ActionFactory.create():A{
返回create(A::class.java)作为
}
ActionFactory().create().run(1)

会有用的。如果你这样做的话,应该记录假设并添加测试

这就是我想要避免的。谢谢,这正是我想要避免的。谢谢