[解決済み] Java 8 の例外型推論における特異な機能
質問
このサイトの別の回答のためにコードを書いているとき、私はこの奇妙なことに遭遇しました。
static void testSneaky() {
final Exception e = new Exception();
sneakyThrow(e); //no problems here
nonSneakyThrow(e); //ERRROR: Unhandled exception: java.lang.Exception
}
@SuppressWarnings("unchecked")
static <T extends Throwable> void sneakyThrow(Throwable t) throws T {
throw (T) t;
}
static <T extends Throwable> void nonSneakyThrow(T t) throws T {
throw t;
}
まず、なぜ
sneakyThrow
の呼び出しがコンパイラにOKされるのか、かなり混乱しています。コンパイラはどのような可能性のある型を
T
に対してどのような型を推測したのでしょうか?
第二に、これがうまくいくとして、なぜコンパイラは
nonSneakyThrow
の呼び出しで文句を言うのでしょうか?それらは非常によく似ているように見えます。
どのように解決するのですか?
のTは
sneakyThrow
であることが推論されます。
RuntimeException
. これは,型推論に関する言語仕様から導かれます (
http://docs.oracle.com/javase/specs/jls/se8/html/jls-18.html
)
まず、18.1.3節に注釈があります。
という形式のバウンド
throws α
は純粋に情報的なもので、可能であればチェックされる例外型にならないようにαのインスタンス化を最適化するよう解決を指示します。
これは何も影響しませんが、解決セクション(18.4)を指し示し、特別なケースで推測される例外型に関するより多くの情報を持っています。
... そうでなければ、もしバインドセットに
throws αi
であり、αi の適切な上界は、最大でもException
,Throwable
そしてObject
であるならば、Ti =RuntimeException
.
このケースに該当するのは
sneakyThrow
- に適用され、唯一の上限は
Throwable
であり、したがって
T
が推論されます。
RuntimeException
であると推測され、コンパイルされます。メソッドの本体は重要ではありません。チェックされていないキャストは実際には起こらないので実行時に成功し、コンパイル時にチェックされる例外システムを破ることができるメソッドを残します。
nonSneakyThrow
はコンパイルされないので、そのメソッドの
T
の下限が
Exception
(つまり
T
のスーパータイプでなければなりません。
Exception
のスーパータイプでなければなりません。
Exception
自体) で呼び出されるタイプによってチェックされた例外となるので
T
として推論されます。
Exception
.
関連
-
無効なメソッド宣言
-
ジャバアレイ
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Javaでよくある構文エラー
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
SocketException java.netの4つの例外解決策。
-
アノテーション「@Retention」の役割
-
java send https request prompt java.security.cert.について。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
htmlとwordの相互変換の実装(画像あり)
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
[解決済み] throws宣言を追加せずに例外を投げる方法はありますか?