gpt4 book ai didi

Kotlin 类型推断失败

转载 作者:行者123 更新时间:2023-12-01 12:25:39 25 4
gpt4 key购买 nike

假设我们有一个包含此类的 3rd-party Java 库:

//----------------------------------------------------------------------------------------

package foo;

public final class Functions {
public interface VoidFunc0 {
void call();
}

public interface VoidFunc1<T> {
void call(T t);
}

@SuppressWarnings("unchecked")
public static <T> NoOpFunc<T> noOp() {
return new NoOpFunc();
}

/*public*/ static final class NoOpFunc<T> implements VoidFunc0, VoidFunc1<T> {
@Override public void call() { /* deliberately no op */}
@Override public void call(T t) { /* deliberately no op */ }
}
}
//----------------------------------------------------------------------------------------

我们成功使用了它的 Functions.noOp()方法在我们的 Java 应用程序中,但是当我们开始在 Kotlin 中重写它时,我们遇到了下面的代码无法编译的问题,并给了我们两个错误:
//----------------------------------------------------------------------------------------
package bar

import foo.Functions

object KotlinApp {
@JvmStatic
fun main(args: Array<String>) {
/*
* Error:(XX, XX) Kotlin: Type inference failed: Not enough information
* to infer parameter T in fun <T : Any!> noOp(): Functions.NoOpFunc<T!>!
* Please specify it explicitly.
*/
callVoidFunc0(Functions.noOp()) // ERROR 1
/*
* Error:(XX, XX) Kotlin: Type Functions.NoOpFunc<Any!>! is inaccessible
* in this context due to: Functions.NoOpFunc<Any!>!
*/
callVoidFunc1(Functions.noOp()) // ERROR 2
}

fun callVoidFunc0(func0: Functions.VoidFunc0) {
func0.call()
}

fun callVoidFunc1(func1: Functions.VoidFunc1<Any>) {
func1.call("A")
}
}
//----------------------------------------------------------------------------------------

但是之前用 Java 编写的相同代码可以编译并且运行良好:
//----------------------------------------------------------------------------------------
package bar;

import foo.Functions;

public class JavaApp {
public static void main(String[] args) {
callVoidFunc0(Functions.noOp()); // OK
callVoidFunc1(Functions.noOp()); // OK
}

public static void callVoidFunc0(Functions.VoidFunc0 func0) {
func0.call();
}

public static void callVoidFunc1(Functions.VoidFunc1<Object> func1) {
func1.call("A");
}
}
//----------------------------------------------------------------------------------------

即使我们指定 T 类型推断也会失败明确地。当 NoOpFunc 时,错误 2 消失声明为 public ,但错误 1 ​​仍然存在。

最佳答案

问题是 Kotlin 中的一个错误。
这是问题的链接:https://youtrack.jetbrains.com/issue/KT-14499 .请投票。

UPD
要解决此问题,有一个解决方法:

@JvmStatic
fun main(args: Array<String>) {
@Suppress("INACCESSIBLE_TYPE")
callVoidFunc0(Functions.noOp()) // (1)

@Suppress("INACCESSIBLE_TYPE")
callVoidFunc1(Functions.noOp<Any>()) // (2)
}

要修复 (1) 必须禁止编译警告,要修复 (2) - 另外明确指定类型。

关于Kotlin 类型推断失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40149675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com