我有这门课:
class MyClass<N extends Number> {
N n = (N) (new Integer(8));
}
Run Code Online (Sandbox Code Playgroud)
我想得到这些输出:
System.out.println(new MyClass<Long>().n);
System.out.println(new MyClass<Long>().n.getClass());
Run Code Online (Sandbox Code Playgroud)
第一项System.out.println()陈述的输出:
8
Run Code Online (Sandbox Code Playgroud)输出第二个System.out.println()陈述:
java.lang.ClassCastException: java.lang.Integer (in module: java.base)
cannot be cast to java.lang.Long (in module: java.base)
Run Code Online (Sandbox Code Playgroud)为什么我得到第一个输出?是不是也有演员?为什么我在第二个输出中得到异常?
PS:我使用的是Java 9; 我用JShell尝试了它,我在两个输出上都有一个例外.然后我尝试使用IntelliJ IDE并获得第一个输出,但第二个输出异常.
使用JShell时,如何将其退回CMD线?
我已经尝试过ctrl+ x而且只是写作退出,但没有快乐.
我试图理解jshell并摸索导入外部库.截至目前,我无法看到任何建议/解决方案.
有人可以告诉我,如果已经弄清楚这一点.
如何指示jshell在脚本结尾处终止,类似于其他语言的解释器,例如python3或node?
遵循命令
./jshell -q /tmp/shell.java
Run Code Online (Sandbox Code Playgroud)
用脚本 /tmp/shell.java
System.out.println("Hello world");
Run Code Online (Sandbox Code Playgroud)
版画
Hello world
jshell>
Run Code Online (Sandbox Code Playgroud)
并等待进一步的命令.我希望它立即停止在文件的末尾.
我正在寻找比System.exit(0);脚本末尾更优雅的东西.
请查看以下编辑内容
我正在尝试创建一个JShell实例,它允许我访问,并允许我与它创建的JVM中的对象进行交互.这适用于在编译时可用的类但对于动态加载的类失败.
public class Main {
public static final int A = 1;
public static Main M;
public static void main(String[] args) throws Exception {
M = new Main();
ClassLoader cl = new URLClassLoader(new URL[]{new File("Example.jar").toURL()}, Main.class.getClassLoader());
Class<?> bc = cl.loadClass("com.example.test.Dynamic");//Works
JShell shell = JShell.builder()
.executionEngine(new ExecutionControlProvider() {
@Override
public String name() {
return "direct";
}
@Override
public ExecutionControl generate(ExecutionEnv ee, Map<String, String> map) throws Throwable {
return new DirectExecutionControl();
}
}, null)
.build(); …Run Code Online (Sandbox Code Playgroud) 鉴于Java 9已经出现在我们身上,我们终于可以拥有一个java REPL了,jshell我希望有一种方法可以将一个shebang添加到脚本中并对其进行jshell解释.
我尝试创建test.jsh:
#!/usr/bin/env jshell -s
System.out.println("Hello World")
/exit
Run Code Online (Sandbox Code Playgroud)
然而,这给了:
? ./test.jsh
| Error:
| illegal character: '#'
| #!/usr/bin/env jshell -s
| ^
| Error:
| illegal start of expression
| #!/usr/bin/env jshell -s
| ^
Hello World
Run Code Online (Sandbox Code Playgroud)
事实证明,在OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440中有一个增强请求.
有没有其他方法可以做到这一点?
我发现了这个问题,而另一个,这个有趣的是它引出了几个问题,至少对我而言:
相当开放的问题,但在哪里被jshell 限制?显然,GUI应用程序不在域中用于jshell解决方案或IDE替换:
超出范围的是图形界面和调试器支持.JShell API旨在允许IDE和其他工具中的JShell功能,但jshell工具并非旨在成为IDE.
维恩图或其他视觉效果的奖励积分.
当然,片段的大小应该是有限的.我更想问一下使用片段无法解决哪些问题.
也可以看看:
我正在尝试使用jshell,但找不到粘贴多行表达式的选项.甚至可以在jshell中粘贴多行.与scala提供的类似paste mode.
我愿意将参数传递给jshell脚本.例如,我会喜欢这样的事情:
jshell myscript.jsh "some text"
Run Code Online (Sandbox Code Playgroud)
然后在脚本中的某个变量中提供字符串"some text".
但是,jshell只需要一个文件列表,因此答案是:
File 'some text' for 'jshell' is not found.
Run Code Online (Sandbox Code Playgroud)
有没有办法将参数正确传递给jshell脚本?
到目前为止,我唯一的解决方案是在调用脚本时使用环境变量:
ARG="some test" jshell myscript.jsh
Run Code Online (Sandbox Code Playgroud)
然后我可以在脚本中访问它:
System.getenv().get("ARG")
Run Code Online (Sandbox Code Playgroud) 我只是在玩 JShell,似乎定义class Z{}然后定义
var z = new Z()不起作用。但是使用不同的类名,比如class Xand class A,确实有效。
当然我一定遗漏了一些明显的东西......?
| Welcome to JShell -- Version 14.0.1
| For an introduction type: /help intro
jshell> class X{}
| created class X
jshell> class Z{}
| created class Z
jshell> var x = new X()
x ==> X@26a1ab54
| created variable x : X
jshell> var z = new Z()
| Error:
| unexpected type
| required: class
| found: type parameter Z …Run Code Online (Sandbox Code Playgroud)