問題タブ [local-class]
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:ローカルクラス内で参照されるローカル変数のパラメーター化された型でローカルクラスを使用する
私はJavaの単一のメソッドで特定のアルゴリズムを実装しています。このアルゴリズムには、他では使用されないデータ構造が必要なので、ローカルクラスを使用するのが適切だと思います。アルゴリズムの最後のステップでは、メソッドの前半で作成されたすべてのオブジェクトを反復処理する必要があるため、ローカルクラスのコンストラクターに、新しく作成されたオブジェクトをリストに追加させると思いました。Javaでは、ローカルクラスは宣言されたローカル変数にアクセスできますfinal
。だから私はこのようなことを試みました:
fooList
ローカルクラス内で参照する前に宣言する必要があるため、これは失敗します。さて、大丈夫、私は思った、私はfooList
メソッドの最初に宣言するだけです:
しかし、これも失敗しますFoo
。参照する前にクラスを定義する必要があるようです。では、どうすればこの循環依存を解消できますか?
java - Javaに「ローカルインターフェース」のようなものはありますか?
Java では、次の例のようにローカル抽象クラスを定義できます。
何らかの理由で、ローカル クラスの代わりに「ローカル インターフェイス」を定義しようとすると、次のようになります。
Java は、「メンバー インターフェイス Bar は、最上位のクラスまたはインターフェイス内でしか定義できない」と不満を漏らしています。これには理由がありますか?それとも、私が犯した間違いを見逃していますか?
c++ - 関数テンプレート内で宣言されている場合、ローカル クラスは依存していますか?
現在の C++ コンパイラ (最新の gcc、clang) ではtypename
、次の例のキーワードが必要です。
を省略した場合typename
、gcc (4.9、5.0) は次のエラーを報告します。
need 'typename' before 'A<f(T)::C>::Type' because 'A<f(T)::C>' is a dependent scope
この例は、私の C++11 標準の読み方によれば、整形式です。
この動作は、次の文言でカバーされているようです。
[温度依存タイプ]/8
ある場合、型は従属です。
テンプレートパラメータ、
未知の専門分野のメンバー、
現在のインスタンス化のメンバーであるネストされたクラスまたは列挙、
cv 修飾されていない型が依存している cv 修飾された型、
任意の依存型から構築された複合型、
任意の依存型から構築された配列型、または値依存の定数式によってサイズが指定された配列型、
テンプレート名がテンプレート パラメータであるか、いずれかのテンプレート引数が依存型または型依存または値依存の式である simple-template-id、または
decltype(expression) で示されます。式は型に依存します。
ただし、[class.local] によると、クラスC
はネストされたクラスではなくローカルクラスです。もしそうなら、なぜ依存として扱われなければならないのですか?A<C>
編集
ボーナス ポイントについては、次のようにメンバー列挙型を追加して例を変更するとC
、次のようになります。
A<C>
依存として扱われるべきですか?
java - 静的コンテキストでのローカル クラス インスタンス作成式
JLS 15.9.2は、囲んでいるインスタンスを決定する方法を教えてくれます。インスタンス化されるクラスを C とし、作成されるインスタンスを i とします。
C が内部クラスの場合、i は次のように決定される、すぐに囲んでいるインスタンス (§8.1.3) を持つことができます。
[...]
C がローカル クラスの場合、次のようになります。
C が静的コンテキストで発生する場合、 i にはすぐに囲んでいるインスタンスはありません。
それ以外の場合、クラス インスタンス作成式が 静的コンテキストで発生すると、コンパイル時エラーが発生します。
それ以外の場合は、O を C のすぐ外側のクラスとします。n を整数とし、O が、クラス インスタンス作成式が現れるクラスの n 番目の語彙的に外側を囲む型宣言になるようにします。
i のすぐ外側のインスタンスは、this の n 番目の字句的に外側のインスタンスです。
太字のケースの意味がわかりませんでした。コンパイルされるべきではなかった例を挙げましょう。
それの何がいけないの?2番目のポイントを説明する実際の例を提供できませんか?