gpt4 book ai didi

java - 让java编译器输出类型推断信息

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:41 26 4
gpt4 key购买 nike

是否有可能让 javac 输出有关它为方法调用推断的类型的信息?

例如,我想知道在 barinvocation 中,对于形式类型 T 的推断是什么。

private static <T> void bar() { ... }
public void foo() {
bar();
}

我正在探索 javac -Xprint 和 friend ,但找不到任何公开这种细节的东西。


编辑示例。我最初不想提出这个问题,因为它会使答案复杂化。我主要对从 javac 中获取调试信息感兴趣。无论如何,这是一个激励人心的例子:

public class Scratch {
private static <T extends Throwable> void sneakyThrow(Throwable t) throws T {
throw (T) t; // Warning: Type safety: Unchecked cast from Throwable to T
}
public void foo() {
sneakyThrow(new Exception());
}
}

这可以编译,但是关于 T 的实际类型的任何合理决定都应该产生 Throwable,并要求 foo() throwsThrowable . Eclipse 似乎认为它是 RuntimeException。我想知道 javac 认为发生了什么。如果是 javacthrows 子句中处理类型参数的错误,这个问题的答案可以让我证明这一点。

最佳答案

可以详细了解 javac 推断/解析的内容等。为此,您需要使用隐藏/不受支持/未记录的选项:-XDverboseResolution。如果要查看所有信息,则传递的值是“全部”,如:-XDverboseResolution=all。如果只想查看通用方法的实例化,那么选项是:-XDverboseResolution=deferred-inference。对于原始问题中的代码,我得到以下输出:

命令:javac -XDverboseResolution=deferred-inference Scratch.java

输出:

Scratch.java:6: Note: Deferred instantiation of method <T>sneakyThrow(Throwable)
sneakyThrow(new Exception());
^
instantiated signature: (Throwable)void
target-type: <none>
where T is a type-variable:
T extends Throwable declared in method <T>sneakyThrow(Throwable)
Note: Scratch.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

从这个输出你可以推断 T 已经被实例化为 Throwable。

我希望这就是您要找的。

关于java - 让java编译器输出类型推断信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24284013/

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