2016-06-06 27 views
10

, ben jshell içindejshell'de genel olarak polimorfik statik yöntem için notasyon türü argümanı nasıl yazılır? Düz 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"); 
} 

yazabilir, ben beyan ve 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" 

kullanın ama tip argüman açık nasıl görmüyorum olabilir.

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

Zımni olan içerik sınıfının adı nedir?

Bu soruya cevap vermeme izin veren jshell belirtiminin (parçası) nerededir? http://openjdk.java.net/jeps/222 sadece "ambalajlama" içinde bir "sentetik sınıf" dan bahseder. Bu adlandırılmış gibi gelmiyor.

+0

'String y = P. kimliğini (" foo ")' kullanın. Sonuç nedir? –

+0

kodumu jshell içinde deneyin, herhangi bir sınıfa girmeyin P. – d8d0d65b3f7cf42

+0

Anlıyorum. Doğrudan JShell'de yöntemleri bildirebilirsiniz. Gizli bir sınıf olmalı. –

cevap

1

Gerçekten de, link, sizin yöntemlerinizi statik yöntemler olarak alan syntetic sınıfının tam türünü (adı gibi) belirtmez.

Ben

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

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

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

ile pasajı yürütülüyor sınıfı almaya çalıştı ama gördüğünüz gibi, bilgi yığın izleme değildir.

atlatma kolay yolu, bir kendi sınıfında statik bir yöntem olarak yönteminizi tanımlamaktır: Bu

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

olabilmesinin önünü ve istenilen sonucu alır

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

.

+0

Muhtemelen jshell'in kaynak kodu: https://github.com/netroby/jdk9-dev/tree/master/langtools/ src/jdk.jshell/share/sınıfları/jdk/jshell –

İlgili konular