java - 如何在 jshell 中标记一般多态静态方法的类型参数?

标签 java jshell

用普通的 Java,我可以写

class P {
    static <A> A id (A x) { return x; }
    static int y = P.<Integer>id(8);
    static String bar = P.<String>id("foo");
}

在jshell中,我可以声明和使用id

jshell> <A> A id (A x) { return x; }
|  created method id(A)

jshell> int x = id(8)
x ==> 8

jshell> String y = id("foo")
y ==> "foo"

但我不知道如何使类型参数显式化。

jshell> String y = <String>id("foo")
|  Error:
|  illegal start of expression
|  String y = <String>id("foo");
|                     ^

隐含上下文类的名称是什么?

允许我回答这个问题的(部分)jshell 规范在哪里? http://openjdk.java.net/jeps/222只是在“包装”中提到了一个“合成类”。听起来好像不能命名。

最佳答案

确实是你的link没有指定将您的方法作为静态方法获取的合成类的确切性质(如名称)。

我试图获取代码片段正在执行的类

jshell> new Exception().printStackTrace()
java.lang.Exception
    at REPL.$JShell$17.do_it$($JShell$17.java:8)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@9-ea/Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@9-ea/NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@9-ea/DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(java.base@9-ea/Method.java:531)
    at jdk.internal.jshell.remote.RemoteAgent.commandLoop(jdk.jshell@9-ea/RemoteAgent.java:124)
    at jdk.internal.jshell.remote.RemoteAgent.main(jdk.jshell@9-ea/RemoteAgent.java:62)

jshell> Thread.currentThread().getStackTrace()[1].toString()
$15 ==> "do_it$(java:18)"

jshell> Thread.currentThread().getStackTrace()[1].getClassName()
$16 ==> ""

但如您所见,信息不在堆栈跟踪中。

规避它的最简单方法是将您的方法定义为自己类中的静态方法:

jshell> class B { static <A> A id(A x) {return x;} }

这允许你调用

jshell> String y = B.<String>id("foo");

并得到想要的结果。

关于java - 如何在 jshell 中标记一般多态静态方法的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37667858/

相关文章:

java - 敌人破坏 slick2d

java - 使用 Java Request Sampler 时如何获取不同监听器中使用的延迟、采样时间、字节和其他此类变量

java - 如何使用 gson 将此 json String 转换为普通的 java arraylist

java 日期转字符串 - 有时是 CET,有时是 CEST

java - 是否可以在使用 Java 9 的 Eclipse IDE 中使用没有类和主要方法的 sysout?

java - RxJava subscribeOn 和observeOn 以及阻塞w/flatMap。谁做了什么?

java - 终止无限循环会卡住终端

java - 使用特定类名时 JShell 错误 "unexpected type"

java - 'jshell' 不被识别为内部或外部命令