約 986,649 件
https://w.atwiki.jp/redcloud/pages/25.html
目次 目次 四大要素 アクティビティ 状態変化時のコールバックメソッド 主なActivity 主なメソッド レイアウト定義(main.xml)で使える主なウィジェット インテント サービス コンテントプロバイダ 情報へのアクセス手段 memo/tips Androidに組み込まれているレイアウトを使う 指定インテントを取り扱えるアクティビティ一覧表示 設定画面を作成する リンク 四大要素 アクティビティ 状態変化時のコールバックメソッド onCreate onResume onStop 主なActivity Activity基底となるアクティビティクラス ListActivity一覧形式のアクティビティクラス ExpandableListActivity伸縮可能な一覧形式のアクティビティクラス MapActivity地図表示のアクティビティクラス PreferenceActivity設定情報を扱うアクティビティクラス 主なメソッド View findViewById(int id)idを指定してレイアウトファイルに定義されているウィジェットを取得 void finish()アクティビティを明示的に終了 Intent getIntent()このアクティビティを開始する契機となったインテントを取得 Application getApplication()このアクティビティが含まれるApplicationオブジェクトを取得 レイアウト定義(main.xml)で使える主なウィジェット TextView EditText ListView Button インテント サービス コンテントプロバイダ 情報へのアクセス手段 query insert update delete getType memo/tips Androidに組み込まれているレイアウトを使う android.R.layout.~ を使う。res/layout下にレイアウトxmlが無くてもOK(組み込まれているから) android.R.layout.simple_list_item_1 (例:ListActivityでよく使うシンプルリストレイアウト) 指定インテントを取り扱えるアクティビティ一覧表示 LaucherActivityを継承したアクティビティを作成する public class LauncherActivityExample extends LauncherActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.launcher_example); } @Override protected Intent getTargetIntent() { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http //developer.android.com/")); //ブラウザ系アクティビティが対象になる return intent; } } 設定画面を作成する PreferenceActivityを継承したアクティビティを作成する XMLで設定項目を定義する res/xml の下に定義ファイルを作成(例:res/xml/pref.xml)※eclipseで[新規]→[Android XML File]でウィザードを使って作成すると雛型ができて楽 Activityクラス public class PreferenceActivityExample extends PreferenceActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref); //xmlの設定を読み込む場合はaddPreferencesFromResourceメソッド } } ソースコードで設定項目を定義する リンク
https://w.atwiki.jp/dragon109/pages/30.html
クッキーの作成 1番目の引数に作成するクッキーのクッキー名を指定。 2番目の引数に保存したい情報を指定。 Cookie cookie = new Cookie("visited", "1"); クッキーをクライアントへ保存 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ : Cookie cookie = new Cookie("visited", "1"); response.addCookie(cookie); } URL http //localhost 8080/cookie/cookietest アプリケーション配置場所 c \servlet-sample\cookie\ web.xmlファイル c \servlet-sample\cookie\WEB-INF\web.xml コンテキストファイル C \Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\cookie.xml クッキーの確認方法 ブラウザのURL入力欄に「javascript document.cookie;」を入力してEnter。 クッキーの取り出し "getCookies"メソッドを使用。 特定のクッキーの検索 「Cookie」クラスで用意されている"getName"メソッドを使用。 クッキーの値を取得 「Cookie」クラスで用意されている"getValue"メソッドを使用。 Cookie cookie[] = request.getCookies(); if (cookie != null){ for (int i = 0 ; i cookie.length ; i++){ if (cookie[i].getName().equals("visited")){ String val = cookie[i].getValue(); } } } URL http //localhost 8080/cookie/cookietest 値の再設定 「Cookie」クラスで用意されている"setValue"メソッドで既存のクッキーに別の値を設定する。 Cookie cookie[] = request.getCookies(); Cookie visitedCookie = null; if (cookie != null){ for (int i = 0 ; i cookie.length ; i++){ if (cookie[i].getName().equals("visited")){ visitedCookie = cookie[i]; } } if (visitedCookie != null){ int visited = Integer.parseInt(visitedCookie.getValue()); visitedCookie.setValue(Integer.toString(visited + 1)); response.addCookie(visitedCookie); } } URL http //localhost 8080/cookie/cookietest 有効期限の設定 作成したクッキーはデフォルトで有効期限がブラウザが閉じるまでとなっている。 「Cookie」クラスで用意されている"setMaxAge"メソッドで有効期限を設定する。 有効期限は秒数で指定する。 例えば1時間に設定したい場合: Cookie cookie = new Cookie("visited", "1"); cookie.setMaxAge(3600); 引数にマイナスの値を設定した場合、有効期限はブラウザが閉じるまでとなる。 引数に0を設定するとクッキーを破棄する。 URL http //localhost 8080/cookie/cookietest
https://w.atwiki.jp/livrenoirscript/pages/119.html
まだ説明が書かれていない... スクリプト本体 スクリプト本体(前提全部入り) 基本情報前提スクリプト 拡張タイプ 説明概要 備考再定義されるメソッド 設定項目 更新履歴 基本情報 前提スクリプト LNS310 RPG BaseItem拡張 拡張タイプ ○ 要設定 (データベースで設定する) 説明 概要 まだ 備考 再定義されるメソッド まだ 設定項目 Param_Value Equip_Param Element_PI Default_TP Default_CRR 更新履歴 2020/12/29 新版公開 コメント すべてのコメントを見る
https://w.atwiki.jp/livrenoirscript/pages/118.html
まだ説明が書かれていない... 未完成 スクリプト本体 スクリプト本体(前提全部入り) 基本情報前提スクリプト 拡張タイプ 説明概要 備考再定義されるメソッド 設定項目 更新履歴 基本情報 前提スクリプト LNS310 RPG BaseItem拡張 拡張タイプ ★ 既成 (導入するだけでゲームの挙動が変化する) 説明 概要 まだ 備考 再定義されるメソッド まだ 設定項目 Detail_Key 既定値 X Detail_Toggle 既定値 false Ignore_Codes Feature_Format Effect_Format 更新履歴 2020/12/29 新版公開 コメント すべてのコメントを見る
https://w.atwiki.jp/makimaaki/pages/11.html
コーディング規約 プログラム全体の基本ルールです。プログラムの動作に関わる内容も含まれますので、しっかり抑えておきましょう。 1.PHPプログラムの書式 改行コード 開始と終了 インデント 一行の長さ 2.命名規則 ファイル名 変数 関数(メソッド) 定数 クラス 3.コーディングスタイル 代入 文字列 配列 条件分岐(if/else/else if) 選択分岐(switch) 繰り返し(while) 繰り返し(for) 関数の使用 関数の宣言 クラスの宣言 クラスのメンバー変数の宣言 クラスのメンバー関数の宣言 コメント プログラム中のSQL文の記述 4.インラインドキュメント ファイルレベル クラスレベル メソッドレベル
https://w.atwiki.jp/tmiya/pages/71.html
第 12 章 ストリームによる計算 (Computing with Streams) 前の章で、変数、代入、および状態を持つオブジェクトを紹介しました。時間とともに変化する実世界のオブジェクトを、計算において変数の状態を変化させることで、モデル化できることを見ました。実世界では時刻は変化します。そのように、プログラム実行における時刻の変化によって、実世界の時刻変化をモデル化できます。もちろん、そのような時刻変化は、通常伸びたり縮んだりしますが、相対的な順番は守られます。これはまったく自然に見えますが、注意すべき大事なことがあります。 いったん変数と代入を導入すると、我々のシンプルでパワフルな関数ベースの計算の置き換えモデルは、もはや適用できないのです。 ほかに方法はないのでしょうか? 実世界の状態変化を、状態を持たない関数を使ってモデル化できないでしょうか? 数学の導きによると、答えは明らかに Yes です。時間変化する量は、時刻 t をパラメータにとる関数 f(t) によって、シンプルにモデル化できます。モデル化だけでなく計算においても、これはうまくいきます。変数を次々と書き換える代わりに、それらすべての値をリストの連続的な要素として表現できます。つまり、ミュータブルな変数 var x T は、イミュータブルの値 val x List[T] で置き換えることができます。ある意味、空間と時間の取引です。変数に代入される様々な値は、リスト中に異なる要素として同時に存在することになります。リストベースモデルの利点の一つは、「タイムトラベル」、つまり変数に代入される連続的な値を同時に見ること、ができることです。ほかの利点としては、強力なリスト処理関数ライブラリを利用して、しばしば計算をシンプルにできることです。たとえば、特定の範囲にある素数すべての和を計算する、命令型プログラムを考えてみましょう。 def sumPrimes(start Int, end Int) Int = { var i = start var acc = 0 while (i end) { if (isPrime(i)) acc += i i += 1 } acc } 変数 i が、範囲[start .. end-1]のすべての値を「経験」していることに注意してください。より関数的な方法では、変数 i の値のリストを range(start, end) によって直接に表現します。 def sumPrimes(start Int, end Int) = sum(range(start, end) filter isPrime) あきらかにプログラムは短くて明快になりました! しかし、この関数型プログラムは効率の点でかなり劣ります。範囲内のすべての数からなるリストを作り、さらにそのうちの素数すべてからなるリストを作るからです。効率の点ではさらに悪いことがあります。次の例を見てください。 1000から10000の間の二番目の素数を見つける。 range(1000, 10000) filter isPrime at 1 これは、1000 から 10000 までのすべての数からなるリストが作りますが、そのリストのほとんどの要素は顧みられません! しかし、あるトリックによって、これらのような例を効率的に実行できます。 シーケンスの後の要素が実際には計算に必要なければ、その計算を回避できるのです。 このようなシーケンスのために新しいクラスを定義します。それを Stream と呼びます。Stream は定数 empty とコンストラクタ cons を使って生成します。これらは scala.Stream モジュールで定義されています。たとえば、次の式は 1 と 2 を要素とするストリームを生成します。 Stream.cons(1, Stream.cons(2, Stream.empty)) ほかの例として、List.range の類似物、ただしリストの代わりにストリームを返すものは、次のようになります。 def range(start Int, end Int) Stream[Int] = if (start = end) Stream.empty else Stream.cons(start, range(start + 1, end)) (この関数は、上のモジュール Stream でも定義されています) Stream.range と List.range は似ていますが、その実行時の振る舞いはまったく違います。 Stream.range は、最初の要素が start である Stream オブジェクトを直ちに返します。そのほかのすべての要素は、tail メソッド呼び出しによって、それらが 必要 になったときにのみ計算されます (tail メソッドはまったく呼ばれないかもしれません) 。 ストリームは単なるリストとしてアクセスされます。リストと同様、基本的なアクセスメソッドは isEmpty と head と tail です。たとえば次のようにして、ストリームのすべての要素を表示できます。 def print(xs Stream[A]) { if (!xs.isEmpty) { Console.println(xs.head); print(xs.tail) } } ストリームは、リストに対して定義されている他のほぼすべてのメソッドもサポートしています (これらがサポートするメソッドの差分については、下記を参照してください) 。たとえば、1000 から 10000 の範囲のストリームに filter と apply を適用して、1000 から 10000 の間の二番目の素数を見つけることができます。 Stream.range(1000, 10000) filter isPrime at 1 先のリストベースの実装との違いは、もはや不必要に三番目以降を構築して素数判定しないことです。 ストリームの CONS と連結 クラス List のメソッドのうち、クラス Stream ではサポートされていないものは、 と の2つです。理由は、これらのメソッドは右側の引数に対して呼ばれるからです。右側の引数に対して呼ばれるということは、その引数は、メソッドが呼ばれる前に評価される必要があるということです。たとえばリストの x xs の場合、後部 xs は が呼ばれる前に評価される必要があり、新しいリストが構築される場合があります。これはストリームではうまくいきません。ストリームの後部は、それが tail オペレーションによって必要となるまでは評価されてはなりません。リストの連結 をストリームに持ち込めないのも、同じ理由です。 x xs の代わりに、最初の要素 x と (未評価の) 後部 xs からなるストリームを構築するには、Stream.cons(x, xs) を使います。xs ys の代わりに、オペレーション xs append ys を使います。 前ページ 12 章 目次 次ページ 名前 コメント
https://w.atwiki.jp/mopsprogramming/pages/34.html
Mini-Logo言語をつくり出す 【以下、【】内は訳者が勝手に付け加えた部分です。なお、少し古すぎると思われた事柄で省略した部分があります。】 クラスPenとPolyで確立されたフレームワークのおかげで、Logo言語のミニチュア版を作ることができます。これは、タートルと呼ばれる三角形のオブジェクトの、スクリーン上での位置や軌跡をコントロールするものです。 — それでこのデモの名前がタートル(Turtle)なのです。 とっかかりの方法をいくつか示すことにします。 そこから、あなたは、かなり精巧なLogo類似の環境を開発することができるはずです。 この実験のために、Turtleのカスタマイズ版を書くことになります。これをLogoと呼ぶことにします。 エディターを用いてTurtleを修正し、あとでMopsにロードするためにLogoという名前を付けて保存します。 他方、新規に起動したのであれば、ファイルSinをロードしてください。わたしたちのLogoプログラムはSinの上にロードされることになります。 注意:FORGETはPowerMopsではもはや旧式のものなっています。確かにこのワード自体はPowerMopsでも定義されていますが、それを実行しても辞書の一部分(コード部分)しか消去しません。ですから、今の場合は、PowerMopsを一旦終了した方がよいでしょう。 言語をデザインする まずは頭の中で、私達のミニLogo言語に何をさせたいのかを決めることから始めましょう。 最初に、スクリーン上に、Polyクラスの三角形オブジェクトとなるであろうタートルが必要です。 次に、いくつかの戦術を実行できる必要があります。例えば:タートルをスクリーン上でセンタリングする;それを与えられた方向に、私達が特定するピクセル数に従って移動させ、タートルはそのペンの軌跡をスクリーン上に残す;私達が特定する角度数値にしたがって右または左に方向転換させる。 そして最後に、ひとつの形、正方形を定義することになります。これは、私達が辺の長さがどうであるべきかをタートルに教えて描画させるものです。 PolyとPenで利用できるメゾッドに目を通すと、ある場所にタートルを描画して、それから別の場所に移動するならば、スクリーン上の元々のタートルは描画されたままになって、スクリーンが汚くなってしまうことに気付きます。 そのようなわけでPenクラスについて追加的なメソッドUNDRAW を定義する必要があります。 これは指定した場所のタートルを消し描き(undraw)するものです。 UNDRAW メソッドはPenPatternを(黒から白に)調節してオブジェクトを再描画することになりますから、このメソッドはDRAW メソッドを用いて定義されることになります。 したがって、UNDRAW メソッドは、DRAW メソッドの後ならPolyクラスの何処にでも、その定義を置くことができます。 PenPattrnパラメタに関しては、CarbonドキュメンテーションのQuickDrawのページを参照することができます。 しかし、そこに助けになるほど十分な情報がなかったとき(ときどきそういう場合がありますが)、あなたはいつもMopsのパワーを役立てることができます。例えば、パラメターを試しながら、Penクラス内にオブジェクトからこのパラメターの現在値を取り出す特別なメソッドを置くことができます。 m INSPECT \ ( -- Hipat LoPat mode w h x y ) get PnPatHi get PenPatLo get PnMode get PnSize get PnLoc ;m 次のようにメッセージを送ります: inspect Bic そして .S演算を実行してスタック上のパラメータを見ます。 INIT メソッドを呼ぶメッセージを用いてパラメターに別の値をおいて実験しましょう。 LogoとUNDRAW に戻ると、白色のペンをつくるPenPatternの値は0,0で、黒色のペンでは-1,-1です。 PnPatHiとPnPatLoの各変数へ整数の組をおいて、白色ペンでオブジェクトを書き、それからペンを黒色に戻します。 UNDRAW メソッドは次のようにしてもよいでしょうでしょう: m UNDRAW \ Erase object before moving it and restore black pen 0 0 put PnPatHi put PnPatLo draw self -1 -1 put PnPatHi put PnPatLo ;m Logo風言語を実装する 次が、変更されたタートルの終わりの方に追加されるMops定義のリストです: \ Create Logo-like environment poly turtle \ the name of our Logo object 250 160 center turtle \ define the center of the screen 10 3 size turtle \ set turtle s size SPOT \ Erases old Logo command onscreen and repositions prompt 8 210 gotoxy ; .OK -curs spot 15 spaces spot +curs ; \ Shortcut definition for later TURN -curs undraw turtle turn turtle draw turtle .ok ; \ Logo-like commands HOME -curs cls home turtle up turtle draw turtle .ok ; FORWARD \ ( dist -- ) -curs undraw turtle move turtle draw turtle .ok ; LEFT ( deg -- ) turn ; RIGHT ( deg -- ) negate turn ; SQUARE { len -- } -curs 4 0 DO len forward 90 right LOOP .ok ; 上のMopsワードは、名前から内容が自ずとわかるはずです。ただ、もしかすると、Logoプロンプトの位置を制御する二つのワードはそうではないかも知れません。 Logoでは伝統的なプロンプトの位置はスクリーンの左下隅に近い位置です。Mopsワード .OK は、オブジェクトがその印をスクリーン上につけた後は、いつもカーソルをプロンプトの位置に戻します。15 SPACESという演算は前のコマンドを上書きしてスクリーンをきれいにするために追加されています。 MopsのUtilitiesメニューから‘Echo during load’アイテムを選んでください。そして、Fileメニューから‘Load...’を選ぶか、 // logo と打ち込むことによってLogoをメモリー中にロードしましょう。 プログラムのソースコードがメモリー中にコンパイルされる毎にスクリーン上に一行にずつ現れるでしょう。 もしも以前に定義されていないワードを用いていた場合は、ロードは中止され、定義が必要なワードを告げるメッセージが現れるでしょう。 ロードが完了したなら、CLS(PowerMopsではUtilitiesメニューから‘Clear Window’を選んでください)でスクリーンをきれいにして、あなたのプログラムを試してください。 タートルをホームのい場所から初めて、いくつかのLogoコマンドを送って、タートルに軌跡を描画させ、方向転換させ、様々な大きさの正方形を描かせてみてください。タートルをある角度だけ方向転換させたとき(特に45度の倍数でない角度のとき)、引き続くコマンドのときにタートルが完全に消去されないことに気付くでしょう。この理由は、ツールボックスがタートルを半端な角度で描画するときにはペンの終着点が元々の出発点から1ピクセル離れてしまう可能性があるからです。このような場合、UNDRAW メソッドを呼び出すと、最後の操作の終着点から消し描き始め、元々の動きから1ピクセル外れてしまいます。 しかし、Mopsでは、これが解決困難な問題となることはありません。ご自分でこの問題に取り組んでみてください。 タートルの出発点を記憶しておくインスタンス変数をオブジェクトに追加して、UNDRAW 操作のときにこれを利用するようにしてみてください。それから、コマンドの入力をもっと容易にするために、新しいMops^Logoワードを定義してください(例えば、Forwardの代わりにFDというような短縮されたワードを定義する。)。 これは、Mopsグロッサリにある諸ワードやクラス-オブジェクト-メッセージ関係に手を染めるための舞台となります。 このチュートリアルの残りのレッスンでは、スクロールバーやマウス入力、ウィンドウ、メニューといったMachintoshらしい特徴を追加するTurtleプログラムの拡張の助けを借りることによって、Mopsの既定義クラスのいくつかをもっと詳しく探求することにします。 チュートリアル目次へ 前へ レッスン17 次へ レッスン19
https://w.atwiki.jp/sevenlives/pages/314.html
エントリ・ポイント(Java) 読み:えんとり・ぽいんと 英語:entry point 別名:メインルーチン 意味: エントリ・ポイントとはプログラムを実行するときの開始位置のこと。 実行コード(ルーチン)の開始アドレス。 言語によってはメインルーチンと呼ぶこともある。 C言語系など多くの言語がmainもしくはMainがエントリ・ポイントの言語が多い。 またそれ以外でもスプリクト言語?など先頭から読んでいき、エントリ・ポイントがない言語もある。 Javaでは「public static void main()」メソッドにあたる。 2010年10月20日 mainメソッド?
https://w.atwiki.jp/akios/pages/71.html
4. 型と値と変数 4.1. 型と変数の種類 4.2. プリミティブ型と値 4.3. 参照型と値 4.4. 型変数 4.5. 引数付き型 4.6. 型の抹消 4.7. 具象可能型 4.8. 未加工型 非ジェネリックのレガシーコードとのインタフェースを容易にするため、引数付き型の抹消や構成要素の引数付き型を抹消した配列型を型として利用できます。このような型を未加工型(raw type)と呼びます。 もう少し正確には、未加工型とは次の1つとして定義されます。 型実引数リストを持たないジェネリック型宣言の名前という形式の参照型 構成要素の型が未加工型である配列型 未加工型Rの非静的メンバー型、Rのスーパークラスやスーパーインタフェースから継承されていないこと 非ジェネリッククラス型やインタフェース型は未加工型ではありません。 未加工型の非静的型メンバーがなぜ未加工とみなせるのか、以下の例を考えます。 class Outer T { T t; class Inner { T setOuterT(T t1) { t = t1; return t; } } } Innerのメンバーの型はOuterの型引数に依存しています。もしOuterが未加工であるなら、InnerはTに対する有効な束縛がないため同様に未加工として扱わなければなりません。 このルールは継承していない型メンバーの場合のみ適用可能です。型変数に依存する継承された型メンバーは未加工型のスーパータイプを抹消するというルールにより生まれた未加工型として継承されます。これはこの説の後で記述します。 上記のルールともう1つ密接に関係するのが未加工型のジェネリック内部クラスはそれ自身未加工型としてのみ使用できるということです。 class Outer T { class Inner S { S s; } } 部分的な未加工型(生焼け型(rare type))であるInnerにはアクセスできません。 Outer.Inner Double x = null; // illegal Double d = x.s; なぜならば、Outer自身は未加工のため、Innerを含むその全ての内部クラスも未加工となるので、Innerへ型実引数を渡すことができなくなるためです。 未加工型のスーパークラス(とスーパーインタフェース)はその引数付き呼び出しにおけるスーパークラス(スーパーインタエース)の抹消です。 スーパークラスやスーパーインタフェースから継承されない未加工型Cのコンストラクター、インスタンスメソッド(8.4.、9.4.)もしくは非静的フィールドMの型は未加工型です。その未加工型はCと対応したジェネリック宣言内のその型の抹消に該当するものです。 未加工型Cの静的メソッドや静的フィールドの型はCと対応したジェネリック宣言内のその型と同じです。 型実引数を未加工型のスーパークラスやスーパーインタフェースから継承されない非静的型メンバーに渡そうとするとコンパイル時にエラーとなります。 引数付き型の型メンバーを未加工型として使用しようとするとコンパイル時にエラーとなります。 これは"生焼け(rare)"型の追放を限定型が引数付きであるケースにも拡張していることを意味していますが、内部クラスを未加工型として使用しようとすると以下のようになります。 Outer Integer .Inner x = null; // illegal これは上で述べたことの逆です。この半分焼けた(half-baked)型の実践的正当化はありません。レガシーコード内では、型実引数は使われません。非レガシーコード内では、ジェネリック型を正しく使い必要とされる全ての型実引数を与えるべきです。 クラスのスーパータイプは未加工型であっても構いません。そのクラスへのメンバーアクセスは通常と同じに扱われ、スーパータイプへのメンバーアクセスは未加工型に対するように扱われます。クラスのコンストラクター内では、superの呼び出しを未加工型のメソッド呼び出しとして扱います。 未加工型の使用はレガシーコードとの互換性を得るための譲歩でしかありません。Javaプログラミング言語にジェネリクスが導入されて以降に書かれたコード内での未加工型の使用は強く反対します。Javaプログラミング言語の将来のバージョンでは未加工型の使用は禁止されるでしょう。 型ルールの潜在的違反を常に廃絶することを確かにするために、未加工型のメンバーへアクセスがあれば、コンパイル時に未検査警告が出力されます。未加工型のコンストラクターのメソッドをアクセスする際のコンパイル時の未検査警告のルールは以下の通りです。 フィールドへの代入の時点 左オペランドの型が未加工型なら、抹消によりフィールドの型が変更されるとして未検査警告をコンパイル時に出力する。 メソッドやコンストラクターの呼び出しの時点 検索するクラスやインタフェースの型が未加工型なら、抹消によりメソッドやコンストラクターの仮引数の型が変更されるとして未検査警告をコンパイル時に出力する。 抹消があっても仮引数の型に変更がないメソッド呼び出し(戻り型やスロー節に変更があるとしても)について、フィールドの読出しについて、もしくは未加工型のクラスインスタンスの作成については、コンパイル時に未検査警告を出力しない。 上記の未検査警告は未検査変換やキャスト、メソッド宣言(8.4.1.、8.4.8.3.、8.4.8.4.、9.4.1.2.)、可変項数メソッド呼び出しで発生する未検査警告とは異なります。 ここでの警告はレガシーコード開発者がジェネリックライブラリを使用した場合を想定したものです。例えば、ライブラリはVector T 型のフィールドfを持つジェネリッククラスFoo T extends String を宣言します。しかし開発者はFooの未加工型であるeに対し (){e.fで整数のベクターを代入します。これはジェネリックス使用ライブラリのジェネリック使用プログラムがヒープ汚染を発生させるということでレガシーコード開発者は警告を受け取ります。 (レガシーコード開発者はライブラリからVector String を自身のVector変数に警告を受けることなく代入できます。つまり、Javaプログラミン言語のサブタイプ化ルールでは未加工型の変数に型の引数付けされたどのようなインスタンスに対する値も代入することができます。) 未検査変換による警告はレガシーライブラリーを使用するジェネリクス開発者が遭遇する2つのケースをカバーします。例えば、ライブラリのメソッドはVector型の未加工型を返し、使用者側はメソッド呼び出しの結果をVector String 型の変数に代入します。これは、未加工ベクターはString以外の要素の型を持っているかもしれないので安全ではありません。しかし、レガシーコードとのインタフェースを保つため未検査変換はまだ使用できるようになっています。未検査変換による警告はジェネリクス開発者がプログラムの違う箇所でヒープ汚染を起こすという問題が発生するかもしれないということを喚起しています。 例4.8-1. 未加工型 class Cell E { E value; Cell(E v) { value = v; } E get() { return value; } void set(E v) { value = v; } public static void main(String[] args) { Cell x = new Cell String ("abc"); System.out.println(x.value); // OK, has type Object System.out.println(x.get()); // OK, has type Object x.set("def"); // unchecked warning } } 例4.8-2. 未加工型と継承 import java.util.*; class NonGeneric { Collection Number myNumbers() { return null; } } abstract class RawMembers T extends NonGeneric implements Collection String { static Collection NonGeneric cng = new ArrayList NonGeneric (); public static void main(String[] args) { RawMembers rw = null; Collection Number cn = rw.myNumbers(); // OK Iterator String is = rw.iterator(); // Unchecked warning Collection NonGeneric cnn = rw.cng; // OK, static member } } このプログラムは、RawMembers T は以下のメソッドを Iterator String iterator() スーパーインターフェースであるCollection String から継承しています。しかし、RawMembers型はCollection String の抹消からiterator()を継承しています。これはiterator()の戻り型はIterator String の抹消であるIteratorであることを意味します。 結果として、rw.iterator()からの代入はIteratorからIterator String への未検査変換を要求し、未検査警告が発生します。 逆に、静的メンバーcngは未加工型のオブジェクトへのアクセスが完全な引数付き型で表されています。(インスタンスへの静的メンバーを通したアクセスは悪いスタイルと考えられており推奨されません。)メンバーmyNumbersはNonGenericクラス(抹消もNonGeneric)より継承されていますので完全な引数付き型です。 未加工型はワイルドカードと密接に関係しています。両方とも実在型に基づいています。未加工型はレガシーコードとの相互接続を達成するために型規則を故意に不安定にしたワイルドカードとみなせます。歴史的には、未加工型はワイルドカードより先に出現しました。最初に紹介したのはGJで、論文Making the future safe for the past dding Genericity to the Java Programming Languageで著者はGilad Bracha、Martin Odersky、David Stoutamire、Philip WadlerでObject-Oriented Programming, Systems, Languages and Applications (OOPSLA 98), 1998年10月のACM会議会議録の中で述べられています。 4.9. 交差型 4.10. サブタイプ化 4.11. 型の使用箇所 4.12. 変数
https://w.atwiki.jp/sklab/pages/51.html
CLRスレッドプール 単純な計算量依存の処理を実行する CLRスレッドプール CLRごとに1つのスレッドプールがある スレッドプールはすべてのアプリケーションドメイン間で共有 単一のプロセス内に複数のCLRがロードされている場合は複数のスレッドプールがある アイドル状態が続くと、スレッドは自動で起動し、処理を実行し終了する リソースの問題が出そうだが、アプリケーションがそれほど多くの処理を実行していないことを意味しているため問題ない 単純な計算量依存の処理を実行する スレッドプールのキューにタスクを投入するには、ThreadPoolクラスが利用される QueueUserWorkItemメソッド QueueUserWorkItem(WaitCallback callback, Object state) callbackに実際の処理を記述