有没有办法在 JShell 中删除导入?

Is there a way to remove imports in JShell?

我发现了 JShell,我发现了默认添加的导入:

jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*

之后,我使用以下命令添加了自己的导入:

import java.lang.Math

有没有办法在不杀死活动的情况下删除后者的导入session/restarting?

我已经尝试发出 /edit 命令,删除导入,单击接受并单击退出,但没有成功。

如评论中所述,/reset 删除了导入,但它也删除了之前在会话中输入的任何其他内容。有没有特定的方法可以只删除导入语句?

经过一番搜索,我设法 find a solution。它是 /list(知道要删除哪一行)和 /drop.

的组合
/drop [name[ name...]|id[ id...]]

Drops a snippet, making it inactive. Provide either the name or the ID of an import, class, method, or variable. For more than one snippet, separate the names and IDs with a space. Use the /list command to see the IDs of code snippets.

jshell> import java.lang.Math

jshell> /list

   1 : import java.lang.Math;

jshell> /drop 1

jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*

对于那些正在寻找一种方法来自动导入公共库的人:

jshell JAVASE

这将自动导入 ~200 个包。就像我们还没有在 Java 世界中看到足够的超凡脱俗的设计决策一样,在谈到第一个 List:

时,笑容可能会消失
jshell> List<Duration> durations = new ArrayList<>();
|  Error:
|  reference to List is ambiguous
|    both class java.awt.List in java.awt and interface java.util.List in java.util match
|  List<Duration> durations = new ArrayList<>();
|  ^--^
|  Error:
|  reference to Duration is ambiguous
|    both class javax.xml.datatype.Duration in javax.xml.datatype and class java.time.Duration in java.time match
|  List<Duration> durations = new ArrayList<>();
|       ^------^

这可以修复,但需要创建一个启动脚本:

  1. 开始jshell JAVASE
  2. 显示导入:/imports
  3. 将其复制到一个文件中,删除所有带有 java.awt 和其他不需要的导入的行
  4. 将这些导入保存到文件中jshell-imports
  5. 开始jshell jshell-imports
jshell> List<Duration> durations = new ArrayList<>();
durations ==> []

当然,每次 Java 更新都必须重新创建文件。