2016-06-06 17 views
10

ở đồng bằng Java, tôi có thể viếtcách ghi chú kiểu đối số cho phương pháp tĩnh đa hình chung trong jshell?

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

trong jshell, tôi có thể tuyên bố và sử dụng 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" 

nhưng tôi không thấy làm thế nào để đưa ra lập luận kiểu tường minh.

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

Tên của lớp ngữ cảnh ngụ ý là gì?

Đặc điểm jshell (một phần của)) sẽ cho phép tôi trả lời câu hỏi này ở đâu? http://openjdk.java.net/jeps/222 chỉ đề cập đến "lớp tổng hợp" trong "gói". Không có vẻ như nó có thể được đặt tên.

+0

Sử dụng 'Chuỗi y = P. id (" foo ")'. Kết quả là gì? –

+0

thử mã của tôi trong jshell, không sử dụng bất kỳ lớp nào P. – d8d0d65b3f7cf42

+0

Tôi hiểu. Bạn có thể khai báo các phương thức trực tiếp trong JShell. Phải có một lớp tiềm ẩn. –

Trả lời

1

Thực tế, link của bạn không chỉ định tính chất chính xác (như tên) của lớp cú pháp được phương pháp của bạn làm phương pháp tĩnh.

tôi đã cố gắng để có được những lớp đoạn mã sẽ được thực hiện với

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 ==> "" 

nhưng khi bạn có thể thấy, những thông tin không có trong stack trace.

Cách dễ nhất để phá vỡ nó, là để xác định phương pháp của bạn như là một phương pháp tĩnh trong một lớp học riêng:

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

này cho phép bạn gọi

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

và nhận được kết quả mong muốn.

+0

Có thể là mã nguồn của jshell: https://github.com/netroby/jdk9-dev/tree/master/langtools/ src/jdk.jshell/share/classes/jdk/jshell –

Các vấn đề liên quan