在未明确指定通用参数的情况下构建期间的UninferredParameterTypeConstructor异常

时间:2016-02-18 15:39:54

标签: kotlin

我有以下代码(使用 RxKotlin 0.40.1 ):

class Result<T, E>(val data: T? = null, val error: E? = null)

fun <T, E> wrapResult(errorInfoFactory: (Throwable) -> E): (Observable<T>) -> Observable<Result<T, E>> = { it.map { Result<T, E>(it) }.onErrorReturn { Result<T, E>(error = errorInfoFactory(it)) } }

仅供参考,需要轻松转换Observable,这可能会将错误转移到始终返回Observable对象的Result,因此永远不会触发onError

我想这样使用它:

fun dangerousOperation() = 0

fun getErrorMessage(t: Throwable) = "error occurred"

fun test() {
    val resultObservable = Observable.fromCallable(::dangerousOperation).compose(wrapResult(::getErrorMessage))
}

使用 Kotlin插件1.0.0-release-IJ141-56 Android Studio 1.5.1 不会突出显示此代码中的任何错误。但是当我尝试构建它时,我得到错误:

  

//错误:(24,9)org.jetbrains.kotlin.codegen.CompilationException:   后端(JVM)内部错误:遇到错误类型:   org.jetbrains.kotlin.types.ErrorUtils$UninferredParameterTypeConstructor@68754e6   (ErrorTypeImpl)。 //原因:遇到错误类型:   org.jetbrains.kotlin.types.ErrorUtils$UninferredParameterTypeConstructor@68754e6   (ErrorTypeImpl)。 //正在编译的文件和位置:(24,9)in   /home/d/work/workspace/Hitch-hiking-Stats/app/src/main/java/ru/netimen/hitch_hikingstats/MemoryRepo.kt   // PsiElement:val resultObservable =   Observable.just(dangerousOperation())。组成(wrapResult(:: getErrorMessage))   //抛出根本原因:JetTypeMapper.java:435 // at   org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:299)   // 在   org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:339)   // 在   org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1532)   // 在   org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1485)   // 在   org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:56)   // 在   org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:22)   // 在   org.jetbrains.kotlin.psi.KtBlockExpression.accept(KtBlockExpression.java:44)   // 在   org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:280)   // 在   org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:339)   // 在   org.jetbrains.kotlin.codegen.ExpressionCodegen.gen(ExpressionCodegen.java:309)   // 在   org.jetbrains.kotlin.codegen.ExpressionCodegen.returnExpression(ExpressionCodegen.java:1873)   // 在   org.jetbrains.kotlin.codegen.FunctionGenerationStrategy $ FunctionDefault.doGenerateBody(FunctionGenerationStrategy.java:50)   // 在   org.jetbrains.kotlin.codegen.FunctionGenerationStrategy $ CodegenBased.generateBody(FunctionGenerationStrategy.java:72)   // 在   org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:364)   // 在   org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:203)   // 在   org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:138)

但是当我将test功能更改为

fun test() {
    val resultObservable = Observable.fromCallable(::dangerousOperation).compose(wrapResult<Int, String>(::getErrorMessage))
}

一切都编好了。但是,如果IDE没有突出显示任何错误,当我没有明确指定wrapResult的泛型参数时,为什么会出现该异常?

1 个答案:

答案 0 :(得分:1)

这是编译器错误:https://youtrack.jetbrains.com/issue/KT-11144。 出现此错误的主要原因是:函数wrapResult仅在自己的返回类型中使用泛型参数T

相关问题