問題タブ [jls]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 言語仕様と VM 仕様の初期バージョンはオンラインで入手できますか?
Oracle にはhttp://docs.oracle.com/javase/specs/に Java 仕様の最新バージョンがありますが、古いバージョンは見つかりませんでした。これらはどこかにアーカイブされていますか?
java - Java クラス名の大文字と小文字の区別
大文字と小文字を区別しない同じ名前の 2 つのパブリック Java クラスを異なるディレクトリに書き込むと、両方のクラスが実行時に使用できなくなります。a(いくつかのバージョンの HotSpot JVM を使用して、Windows、Mac、および Linux でこれをテストしました。同時に使用できる JVM が他にAあるとしても驚かないでしょう。)
上記のコードを含む 3 つの eclipse プロジェクトは、私の Web サイト から入手できます。
myCase試してみると、次のように両方のクラスを呼び出します。
タイプチェッカーは成功しますが、上記のコードで生成されたクラス ファイルを実行すると、次のようになります。
スレッド「メイン」の例外 java.lang.NoClassDefFoundError: testcase/A (間違った名前: testcase/a)
Java では、名前は一般に大文字と小文字が区別されます。一部のファイル システム (Windows など) では大文字と小文字が区別されないため、上記の動作が発生することに驚きはありませんが、間違っているようです。残念ながら、Java の仕様は、どのクラスが表示されるかについて、奇妙に非コミットです。Java 言語仕様 (JLS)、Java SE 7 Edition (セクション 6.6.1、166 ページ) は次のように述べています。
クラスまたはインターフェイス型が public と宣言されている場合、それが宣言されているコンパイル ユニット (§7.3) が監視可能であれば、任意のコードからアクセスできます。
セクション 7.3 で、JLS はコンパイル単位の可観測性を非常にあいまいな用語で定義しています。
定義済みパッケージ java とそのサブパッケージ lang および io のすべてのコンパイル ユニットは、常に監視可能です。他のすべてのパッケージの場合、ホスト システムはどのコンパイル ユニットが監視可能かを判断します。
Java 仮想マシン仕様も同様にあいまいです(セクション 5.3.1):
次の手順を使用してロードし、それによってブートストラップ クラス ローダーを使用して [バイナリ名] N で示される非配列クラスまたはインターフェイス C を作成します [...] それ以外の場合、Java 仮想マシンは引数 N をメソッドの呼び出しに渡します。ブートストラップ クラス ローダーを使用して、プラットフォームに依存する方法で C の表現とされるものを検索します。
これらはすべて、重要度の高い順に次の 4 つの質問につながります。
- すべての JVM で、デフォルトのクラスローダーによってどのクラスがロード可能であるかについて保証はありますか? つまり、java.lang と java.io 以外のクラスをロードしない、有効であるが縮退した JVM を実装できますか?
- 保証がある場合、上記の例の動作は保証に違反していますか (つまり、動作はバグですか)?
- HotSpot
aをA同時にロードする方法はありますか? カスタム クラス ローダーの作成は機能しますか?
java - 省略された varargs の動作について説明している Java 言語仕様の部分はどれですか?
可変アリティ (vararg) メソッドを呼び出すときの動作を説明する Java 言語仕様 (JLS) の関連部分を探しています。
次の方法を検討してください。
メソッドを次のように呼び出すと、次のようになります。
出力は次のようになります。呼び出しサイトで[]の省略がメソッドargsで空の配列に変換されているためです。printVarArgs
この動作を定義する JLS のポイントを探しています。私が見つけた最も近いものは15.12.4.2 Evaluate Argumentsですが、この例は示されておらず、このケースが実際に形式的/数学的な説明でカバーされているかどうかはわかりません。
vararg が省略された場合の空の配列の自動作成について説明している JLS の部分はどれですか?
java - Javaでtry/catchまたはsyncedにステートメントブロックが必要なのはなぜですか?
Javaでは、特定のキーワードの後にステートメントまたはステートメントブロックを続けることができます。例えば:
同様にコンパイルします
forこれは、whileなどのキーワードにも当てはまります。
ただし、一部のキーワードではこれが許可されていません。synchronizedブロックステートメントが必要です。についても同じですtry ... catch ... finally。これには、キーワードの後に少なくとも2つのブロックステートメントが必要です。例えば:
動作しますが、以下はコンパイルされません。
では、なぜJavaの一部のキーワードはブロックステートメントを必要とし、他のキーワードは単一ステートメントだけでなくブロックステートメントも許可するのでしょうか。これは言語設計の矛盾ですか、それともこれには特定の理由がありますか?
java - JLSの「オーバーライドと非表示の要件」のサブクラスの互換性のないリターンタイプ
JLSからの引用
リターンタイプR1のメソッド宣言d1が、リターンタイプR2の別のメソッドd2の宣言をオーバーライドまたは非表示にする場合、d1はd2の代わりにリターンタイプである必要があります。そうしないと、コンパイル時エラーが発生します。 さらに、R1がR2のサブタイプでない場合は、チェックされていない警告を発行する必要があります(抑制されていない限り(§9.6.1.5))。メソッド宣言には、オーバーライドまたは非表示にするメソッドのスロー句と競合するthrows句(§8.4.6)を含めることはできません。そうしないと、コンパイル時エラーが発生します。
太字の文は段落の最初の部分と矛盾しません。
以下のJLSで、これが一般的な返品に適用されることを確認できます。
List<String>リターンタイプはリターンタイプによってオーバーライドされますListが、それでもJLSのその文は、この状況だけにこれを除外しません。その文が適用される別の状況があるかどうかを明確にできますか?
java - ダブルチェック ロックの順不同書き込み
二重チェックされたロックのシナリオでの順不同の書き込みについて言及されている例 (参照: IBM の記事とウィキペディアの記事)
コンストラクターが完全に初期化される前に Thread1 が同期ブロックから出てくる単純な理由を理解できませんでした。私の理解によると、「新規」の作成と呼び出しコンストラクターは順番に実行する必要があり、同期ロックはすべての作業が完了するまで解放されるべきではありません。
ここで何が欠けているか教えてください。
java - Java 言語に機能を追加するにはどうすればよいですか?
ジェネレーターや最近の「待機」機能など、Java に関連する他の言語のいくつかの優れた機能を見てきました。バイトコード操作を使用してそれらのいくつかを実装しようとしました。しかし、これらはほとんどの開発者が言語機能にするのに十分なほどきちんとしていると思います。kijaro プロジェクトを見てきました。ただし、そこに到達する方法に関するドキュメントはほとんどないようです。では、たとえ私自身の使用と好奇心のためであっても、どのようにアプローチすればよいのでしょうか?
ありがとう!
java - 「qualifiedthis」コンストラクトはJavaで何を意味しますか?
アイテム「アイテム22:非静的よりも静的メンバークラスを優先する」内のEffective Javaで、 JoshBlochは次のように述べています。
非静的メンバークラスの各インスタンスは、それを含むクラスの包含インスタンスに暗黙的に関連付けられます。非静的メンバークラスのインスタンスメソッド内で、囲んでいるインスタンスでメソッドを呼び出すか、修飾されたthis構造を使用して囲んでいるインスタンスへの参照を取得できます。
彼はQualifiedThisConstructとはどういう意味ですか?
java - Java - 同じメソッドと異なる戻り値の型を持つ複数のインターフェイスを実装する
次のコードを検討してください。
これにより、 でコンパイル エラーが発生しますAB。
タイプ B と A は互換性がありません。どちらも another() を定義していますが、戻り値の型は無関係です
私はこのSOの質問を見て、受け入れられた回答の非互換性の例に従ってください-つまり
ただし、その場合、戻り値の型はまったく互換性がありませんでした。戻り値の型は void とブール値の両方にすることはできません。一方、上記の例では、 のanother()戻り値の型ABは anAと a の両方Bであるため、両方の拡張インターフェイスを実装できます。
さらに、JLS (8.4.8、8.4.8.3、8.4.8.4) を見ても、上記の例が違法である理由がよくわかりません。誰かが私にこれを説明できますか?
A第二に、またはBの契約要件を繰り返す以外に、これに対する解決策/回避策はありますABか?
java - Java コンパイラは、静的呼び出しに対してフロー センシティブであることを許可されていますか?
JLS セクション 8.4.8.2 の簡単な例を次に示します。
例の説明によると、running の出力はmain()"Goodnight, Dick" になります。これは、静的メソッドが呼び出される変数/式の静的型に基づいて呼び出されるためです。
これが私の質問です。適度にフローに敏感なコンパイラでもs、呼び出し時に格納されているオブジェクトの型は常に でなければならないことを理解できますSub。したがって、コンパイラがその情報を使用できる場合、静的メソッドを呼び出しても、いくつかのダイナミックバインディングの感触。これが許可されないのはなぜですか?Javaには、すべてのコンパイラがまったく同じように動作するバイトコードを生成するという明確な目標がありますか、それとも他の理由がありますか?