一个公司做两个网站可以吗/厦门百度快速优化排名
在
Java中,定义通用异常类是非法的.编译器将拒绝编译以下内容:
public class Foo extends Throwable {
// whatever...
}
但是,这个Scala代码编译得很好:
class Foo[T](val foo: T) extends Throwable
即使是奇怪的,只要我捕获原始的Foo类型,我就可以在Java代码中使用这个Scala类:
public class Main {
public static void main(String[] args) {
try {
throw new Foo("test");
}
catch(Foo e) {
System.out.println(e.foo());
}
}
}
这编译,运行和打印“测试”.
这是根据JLS和JVM规范很好地定义,还是偶然发生?
Java对通用异常的限制纯粹是语言限制还是也适用于字节码(在这种情况下,Scala编译器生成的字节码无效)?
编辑:这是Scala类在反编译后看到的内容:
public class Foo extends java.lang.Throwable {
public T value();
Code:
0: aload_0
1: getfield #15 // Field value:Ljava/lang/Object;
4: areturn
public Foo(T);
Code:
0: aload_0
1: aload_1
2: putfield #15 // Field value:Ljava/lang/Object;
5: aload_0
6: invokespecial #22 // Method java/lang/Throwable."":()V
9: return
}