Java ではthrows、元の抽象メソッドが ( .) でない場合、オーバーライドされた抽象メソッドに何らかの例外を指定することはできoverridden method does not throw Exceptionません。ただし、Scalaではチェック例外がないため、これを行うことができます。わかりましたが、Java コンパイラーに何が起こっているかを知らせるアノテーションを使用する場合、そうでしょうか?@throws
この Scala コードを考えると:
package myscala
abstract class SFoo {
def bar(): Unit
}
class SFoobar extends SFoo {
@throws[Exception]
override def bar(): Unit = {
throw new Exception("hi there")
}
}
私は 2 つの異なる Java プログラムを持っています。そのうちの 1 つは実行時にコンパイルされて実行され、もう 1 つはコンパイルされExceptionません。
コンパイル:
import myscala.SFoo;
import myscala.SFoobar;
public class Foobar {
public static void main(String[] args) {
SFoo mySFoo = new SFoobar();
mySFoo.bar();
}
}
コンパイルしない ( unreported exception Exception; must be caught or declared to be thrown):
import myscala.SFoo;
import myscala.SFoobar;
public class Foobar {
public static void main(String[] args) {
SFoobar mySFoo = new SFoobar(); // only difference is the declared type
mySFoo.bar();
}
}
よくわかりません。Java コンパイラは、そのような宣言がないSFoobar.barにもかかわらず例外をスローすることを宣言しているという事実を認識せずFoo.bar、その結果、同様のコンパイル エラーが発生するのはなぜですか?