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は、「ラッピング」で「合成クラス」について言及しているだけです。名前が付けられないように聞こえます。

4

1 に答える 1

1

実際、リンクは、メソッドを静的メソッドとして取得する合成クラスの正確な性質 (名前など) を指定していません。

スニペットが実行されているクラスを取得しようとしました

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

目的の結果が得られます。

于 2016-06-15T14:36:05.300 に答える