2015-11-18 66 views
4

我在玩JShell並試圖將變量轉換爲其原始形式。要做到這一點,我使用/r重置在REPL的一切,然後我進口java.util.*和創建的列表:在JShell中將變量轉換爲其原始形式

-> import java.util.*; 

-> List<String> l = new ArrayList<>(Arrays.asList("a", "b")); 
| Modified variable l of type List<String> with initial value [a, b] 

現在我想要的清單值轉換爲大寫,所以我做:

-> l.replaceAll(String::toUpperCase) 

-> l 
| Variable l of type List<String> has value [A, B] 

清單使用/list執行的源我已經輸入(或/l)表示:

-> /l 

    1 : List<String> l = new ArrayList<>(Arrays.asList("a", "b")); 
    2 : l.replaceAll(String::toUpperCase) 
    3 : l 

現在,當我嘗試重置列表上演,我得到了import聲明(改變其值之前):

-> /1 
import java.util.*; 

有誰知道爲什麼會這樣?我在沒有import聲明的情況下嘗試了相同的操作,但是我得到了相同的結果(我認爲這是因爲它顯式導入)。


我剛剛注意到,如果我寫/l all我得到:

-> /l all 

s1 : import java.util.*; 
s2 : import java.io.*; 
s3 : import java.math.*; 
s4 : import java.net.*; 
s5 : import java.util.concurrent.*; 
s6 : import java.util.prefs.*; 
s7 : import java.util.regex.*; 
s8 : void printf(String format, Object... args) { System.out.printf(format, args); } 
1 : String a = "a"; 
2 : a = "b" 

我不知道爲什麼/1執行第一import聲明,而不是第一個字符串賦值。即使import java.util.*;在那裏,s5import java.util.concurrent.*;(這顯然是多餘的)也是非常奇怪的。

回答

2

編輯

貌似問題是在JDK 9 EA build 107 on 03-01-2016 (#4560)解決。


經過數小時的挖掘,我找到了一個解釋。命令:

/list all 

列出所有處決,包括那名小號 ilently和自動前的REPL執行啓動項開始:

s1 : import java.util.*; 
s2 : import java.io.*; 
s3 : import java.math.*; 
s4 : import java.net.*; 
s5 : import java.util.concurrent.*; 
s6 : import java.util.prefs.*; 
s7 : import java.util.regex.*; 
s8 : void printf(String format, Object... args) { System.out.printf(format, args); } 
1 : String a = "a"; 
2 : a = "b" 

一種解決方案是使用/setstart命令並將其傳遞給包含您指定的條目的文件。這樣你就不會有默認的導入和方便的打印方法。

另一種解決方案是編寫/9(緊接在最後一個靜默條目之後的狀態)。

說實話,我對這兩種解決方案都不滿意,我希望很快會有更好的解決方案。

+0

/ 重新執行該代碼段。它不會重置執行到那一點。 –