我想你们中的大多数人都知道这goto是 Java 语言中的保留关键字,但实际上并未使用。您可能还知道这goto是一个 Java 虚拟机 (JVM) 操作码。我认为所有的Java,Scala和科特林的复杂的控制流结构,在JVM的水平,使用的某种组合来实现goto和ifeq,ifle,iflt,等。
查看 JVM 规范https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto_w我看到还有一个goto_w操作码。而goto采用 2 字节的分支偏移量,goto_w采用 4 字节的分支偏移量。该规范指出
尽管goto_w指令采用 4 字节的分支偏移量,但其他因素将方法的大小限制为 65535 字节(第 4.11 节)。此限制可能会在 Java 虚拟机的未来版本中提高。
在我看来goto_w,就像其他一些*_w操作码一样,它是面向未来的。但我也goto_w想到,也许可以将两个更重要的字节归零,两个不太重要的字节与 for 相同goto,并根据需要进行调整。
例如,给定这个 Java Switch-Case(或 Scala Match-Case):
12: lookupswitch {
112785: 48 // case "red"
3027034: 76 // case "green"
98619139: 62 // case "blue"
default: …Run Code Online (Sandbox Code Playgroud) 这更多是为了看看 Kotlin 是否真的可以在 NetBeans 中工作,即使它需要跳过太多的障碍才能实用。如果我确实需要使用 Kotlin,我可以使用 IntelliJ。
据说 Kotlin 可以在 Eclipse 和 NetBeans 中使用。看起来您可以在 NetBeans 中随心所欲地编写 Kotlin,但它根本无法运行。
我安装了 Kotlin for NetBeans 插件,它似乎可以工作。它具有人们所期望的所有提示和语法突出显示。但当涉及到实际运行用 Kotlin 编写的东西时,NetBeans 似乎完全无能为力。我在将 JUnit 导入 Kotlin 测试类时也遇到了问题。
但首先要完成的事情是 Hello World。我尝试了几个简单的 Hello World。Java Hello World 运行。Kotlin Hello World 没有。我什至尝试通过 Scala REPL 运行它,得到了大致相同的结果。
来自HelloWorld.kt(这只是缺少许可证头提醒和生成的 Javadoc):
package basicexerciseskotlin
fun main(args: Array<String>) = println("Hello, world, from Kotlin!")
Run Code Online (Sandbox Code Playgroud)
我的初稿有很多错误和警告,提示帮助我将其变成了这种形式,所以现在我有一个绿色指示器。但是“运行”>“运行文件”呈灰色,并且键盘快捷键不起作用。
然后我想也许我可以HelloWorld.main()从 Java 类中调用。为了弄清楚如何做到这一点,我在 IntelliJ 中做了一个类似的项目。我将 IntelliJ 中的内容复制到 NetBeans,但我必须注释掉调用HelloWorldKt.
来自BasicExercisesKotlin.java(项目中的主类,就 NetBeans 而言):
package basicexerciseskotlin;
public class BasicExercisesKotlin …Run Code Online (Sandbox Code Playgroud) 任何能回答这个问题的人都知道,JVM 支持多种字节码指令来调用方法(invokevirtual, invokespecial, invokestatic, ...)
对实例方法的大多数方法调用是由 进行的invokevirtual,但私有方法和初始化方法是通过 调用的invokespecial,如 JVM 规范中所述:
invokespecial和invokevirtual指令的区别在于invokevirtual根据对象的类调用方法。该invokespecial指令用于调用实例初始化方法以及当前类的超类的私有方法和方法。
据我了解,invokevirtual执行 vtable 查找来解析方法 while invokespecial,因为在链接时知道正确的方法实现,静态解析。
我的问题是,为什么在编译时已知方法所有者的具体类的情况下invokespecial不用于调用public方法?在我看来,出于效率原因,避免 vtable 查找是可取的。但很明显,我对 JVM 有一些不了解。
在本地 Scala REPL 中,可以定义流和惰性列表,而无需关键字lazy。
scala> val fibo: LazyList[BigInt] = (0: BigInt) #:: (1: BigInt) #:: fibo.zip(fibo.tail).map { n => n._1 + n._2 }
fibo: LazyList[BigInt] = LazyList(<not computed>)
scala> fibo(100)
res17: BigInt = 354224848179261915075
scala> val prime: LazyList[Int] = 2 #:: LazyList.from(3).filter(i => prime.takeWhile {
| j => j * j <= i
| }.forall {
| k => i % k != 0
| })
prime: LazyList[Int] = LazyList(<not computed>)
scala> prime(100)
res18: Int = 547
Run Code Online (Sandbox Code Playgroud)
这与 …
我认为,在Scala中Map[Class[_ <: SomeSuperClass], V]创建一个不可变的映射,从而K为classOf[T]地方T是直接或间接的子类SomeSuperClass。我在这一点上可能是错的,这可能与我的问题有关,也可能无关。
我发现我无法真正访问这些V值。如何将 的子类映射SomeSuperClass到V值?
例如,打牌。在二十一点中,千斤顶、皇后和国王的价值都与十相同。但是在其他游戏中,它们可能具有不同的值,例如 jack 的值是 11,皇后的值是 12,而国王的值是 13。
给定一个抽象Rank类和子类Ace, Two, Three, ..., King, 在cards包中,包中的类blackjack可以有这样的功能:
def valueOf(rank: Rank): Int = rank match {
case _: Ace => 11 // TODO: Figure out when value 1
case _: King => 10
case _: Queen => 10
case _: Jack => 10 …Run Code Online (Sandbox Code Playgroud)