情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | 編集

Javaのraw type警告を消す方法メモ このエントリーを含むはてなブックマーク

raw type 警告

raw typeというのは、ジェネリクス型(型変数を持つ型)の<T>のような型変数部分を取り除いた型のことを言います。たとえば、「Set」は「Set<V>」のraw typeです。

そして、基本的にraw typeは、Java 5より前のバージョンとの互換性のために存在しているイメージで、利用しないことが推奨されます。なので、うかつにraw型を利用すると、次のような警告が出ますここでは、Classクラスを用いた場合です

Class is a raw type. References to generic type Class should be parametarized

日本語だと

Classはraw型です。総称型Class<T>への参照は、パラメーター化する必要があります

ここでは、Eclipseを利用していて、利用しているフレームワークなど、自分が書いたコード以外の部分に警告が表示されている状況を想定します。

Eclipseの言うとおり、アノテーションを付ける

Eclipseを使っていると、修正候補として

Add @SuppressWarnings 'rawtypes' to 'clazz'

のように表示されます。これの通りに修正すれば

Class clazz = ...

が、次のようになります。

@SuppressWarnings("rawtypes") Class clazz = ...

もしフレームワーク内にこのような修正箇所が大量にある場合、何かやる気が起こりませんし、追加する量が多いのに加えて、読むときに邪魔です。そもそもフレームワークに追記すること自体やりたくないです。

総称型にする

総称型を使わないからエラーが出るので、総称型を使えばいいわけです。ということで、シンプルには

Class

と書いてある部分を徹底的に

Class<適切な型名>

にすればいいわけです。そして、徹底的にそれをやるとどうなるかというと、

Cannot create a generic array of Class<型名>

配列でraw typeが使われていると、この方法ではまた別のエラー、そしてこちらはコンパイルできないエラーになってしまいます。

<?>で総称型にする

もっとシンプルに、<?>を問題のraw typeの後ろに付けて総称型にしてしまう手もあります。これを使うとGeneric Type配列が作成できないことを回避できるわけです。なので、配列のところだけ<?>と書いておけばいいことになります。

しかし、それでもやはりソースコードを書き換えたくない。というか、とにかく警告が邪魔なわけです。

Eclipseの警告を表示する機能を止める

警告表示自体をEclipseの設定によって抑制すればソースコードを書き換えることなく、大量の警告を止めることが出来ます。

Window>Preferences>Java>Compiler>Errors/Warnings>Generic types>Usage of a raw type」でWarningをIgnoreにすればOK。

また、設定画面の「Configure Project Specific Settings」を利用すれば、特定のProjectに対してのみこの設定を適用することも出来ます。

まとめ

Eclipseの警告を抑制する方法をメモしたかっただけです

スポンサーサイト
Eclipse | コメント:0 | トラックバック:0 | 編集

Javaジェネリクスに関する資料メモ このエントリーを含むはてなブックマーク

Javaのジェネリクスに関して調べている最中に見つけた文章の中で、メモしておきたいものをまとめました。 ものすごく怪しい説明がweb上にある中で、それなりに参考になりそうな資料に絞りました。

全体的に、「Javaのジェネリクスが何かわかるし、書き方も分かるけど、使いどころの判断が付かない」人が、いろいろ知ることで判断付けられるようにしていこうって感じ。ジェネリクスを知らないとなると読むのは大変かも。

Java | コメント:0 | トラックバック:0 | 編集

C#(.NET)でハッシュテーブルを利用する方法の基本と注意点 このエントリーを含むはてなブックマーク

C#(.NET)でハッシュテーブルを利用するときに関するメモ

正直、msdnなどを見えればいいのですが、毎回みるのも面倒なので、基本的なことをここに書いておきます。以下、ジェネリクスを利用したハッシュテーブルを紹介し、ジェネリクスでない場合については触れません。特に制限された開発環境でない限り、ジェネリクスを利用しない意味はないと思われます。

ハッシュテーブルを実装したクラス

そもそもHashテーブルを表すインターフェースはIDictionary<TKey, TValue>。 実装されているクラスは、

  1. Dictionary<TKey, TValue>クラス
  2. SortedDictionary<TKey, TValue>クラス
の2つです。

データを保存(追加・格納)する方法

データを保存する方法は基本的に2つ。

  1. Add(TKey key, TValue value)メソッドを利用する
    シンプルな方法です。keyとvalueのペアを指定するだけ。すでに利用されているkeyに対してvalueを重複して追加しようとすると、ArgumentExceptionがスローされます。
  2. インデクサを利用する
    インデクサを利用するとは、
    dictionary["key"] = new TValue();
    こんな感じです。実際、このようにすると、Add("key", new TValue());と同じように追加されますが、実は、大きな違いがあります。それは、keyが重複していても、例外を返さず、上書きされるということです。例外が帰ってくるのが面倒だったり、そもそも重複していないかチェックするくらいなら、インデクサを使った方がいいでしょう。

データを取得する方法

データを取得する方法は2つ。

  1. Itemプロパティを利用する
    基本的な取得方法はこれ。Keyを指定すると、Valueが返ってきます。わかりやすい。ただし、C#においては、インデクサとして実装されていることに注意。
    TValue value = dictionary["key"];
    という書き方で利用します。インテリセンスを利用して「Dictionaryから要素を取得するメソッドがないぞ?」と思った人。インデクサだから見つからないわけです。
  2. TryGetValueメソッドを利用する
    これは、Keyに対応する値が、保存されているかあやしい場合に利用します。Itemプロパティを利用すると、Keyに対応する値がない場合例外が返されて余計な時間がかかってしまいます。そこで、Keyに対応する値が保存されていない場合が多いと考えられるときはTryGetValueを利用します。このメソッドは例外を返さないので、オーバーヘッドが小さくできます。例外を返さない代わりに、値が保存されていないときは規定値(0, false, null)が返ってきます。

データを削除する方法

追加、取得、ときたら、削除ですね。削除する方法は1つ。

  1. Remove(TKey key)メソッドを利用する。 keyに対応するエントリ(key-valueペアのこと)を削除するには、
    dictionary.Remove("key");
    とすればよいことになります。削除できたときtrueを返します。また、削除できなかったとき、特に、keyが見つからないとき、falseを返します

まとめ

基本的な操作は、以上のメソッドやプロパティで行えます。特に、インテリセンス(コード補完機能)にたよっていると、インデクサの存在に気づけないこともあるので、注意が必要です。

それぞれの項目についての詳細は、リンク先のmsdnライブラリをご覧ください。リンク先は、.NET Framework 3.5 になっていますが、リンク先から別バージョンへ簡単に移動できます。

.NET | コメント:0 | トラックバック:0 | 編集

.NET ジェネリクス版SortedList について 訂正 このエントリーを含むはてなブックマーク

前回のSortedListに関する記事で、System.Collections.IComparableの代わりにジェネリクス版ではSystem.Collections.Generic.IComparer<T>を利用すると書きましたが、System.Collections.IComparableの代わりは、System名前空間にSystem.IComparable<T>として存在しているみたいです。

つまり、MSDNによれば、

基本的にSortedList<TKey, TValue>のTKeyに使うクラスは、System.IComparable<T>を実装しているべきであるそうです。そして、もし、その実装ができない(したいクラスのソースがない場合など)には、外部にSystem.ICompararer<T>を用意して、それを利用して比較させる(この文章は完全に私の解釈です)

ということらしいです。

ふむふむ、って感じです。System.Collections.Generic.SortedList<TKey, TValue>よりもその名前を気にせずに、System.Collections.Generic.List<T>を利用して、List<T>.Sort()メソッドを利用した方がわかりやすく、柔軟な気がしました

というか、Javaの方が使いやすく感じた記憶が強いのはなぜなんでしょうか・・・
.NET | コメント:0 | トラックバック:0 | 編集
 | HOME | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。