在JShell中将变量转换为其原始形式

时间:2015-11-18 15:16:01

标签: java java-9 jshell

我正在玩JShell并尝试将变量转换为原始形式。为此,我使用/r重置REPL中的所有内容,然后导入java.util.*并创建一个列表:

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

现在,当我尝试将列表重置为 1 (在更改其值之前)时,我收到了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.*;(这显然是多余的),也很奇怪。

1 个答案:

答案 0 :(得分:2)

修改

看起来问题已在JDK 9 EA build 107 on 03-01-2016 (#4560)中解决了。

经过几个小时的挖掘,我找到了解释。命令:

/list all

列出所有执行,包括在 REPL开始之前 s 以及自动执行的启动条目:

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(在最后一次静默条目之后的状态)。

说实话,我对这两种解决方案都不满意,我希望很快会有更好的解决方案。