首页 文章

如何在jshell中为一般多态静态方法注明类型参数?

提问于
浏览
10

在普通的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刚刚在"the wrapping"中提到"synthetic class" . 听起来不像它的名字 .

1 回答

  • 1

    实际上,你的link没有指定将你的方法作为静态方法的syntetic类的确切性质(如名称) .

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

    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");
    

    并获得所需的结果 .

相关问题