
以下のメソッドを含むプログラムをEclipseで作成している際に次のような警告が発生しました。
型の安全性:型Comparator の式は、未検査の型変換を使用してComparator<? super T>に準拠するようにする必要があります。
型の安全性:型 Arrays の総称メソッド sort(T[], Comparator<? super T>)の未検査の呼び出し sort(Object[],Comparator)がありました。
コンパイルして実行する分には、なんら問題ないのですが、この警告の意味と解決策が分からないままにしておくのは気持ち悪いので、分かる方がいらしたら教えてください。
static void sortName(){
String array[] = new String[4];
array[0] = "abba";
array[1] = "abab";
array[2] = "aaaa";
array[3] = "aabb";
Comparator asc = new Comparator() {
public int compare(Object obj0, Object obj1) {
String nameKana0 = (String)obj0;
String nameKana1 = (String)obj1;
int ret = 0;
ret = nameKana0.compareTo(nameKana1);
return ret;
}
};
Comparator comparator = asc;
Arrays.sort(array, comparator); // 配列をソート
for (int i = 0; i < array.length; i++)
System.out.println(array[i]);
}
No.2ベストアンサー
- 回答日時:
#1さんの通り、SDK1.4に戻せば警告は発生しなくなります。
そもそも、JDK 5.0 から何故このような警告が発生するようになったかを考えてみます。
Comparator匿名クラス内のcompare()メソッド内で引数Object obj1, obj2 を(String)にキャストしていますよね。しかし、これがもしString型で無い場合はどうなるでしょう。
例えば、Arrays.sort(array, comparator); のarrayが String[] ではなく、極端な話 Integer[] の場合です。 IntegerはObjectを継承しているので構文的にも間違いはなく、コンパイルも問題なく通りますがおそらく実行時にIntegerインスタンスをStringにキャスト出来ず、Cast関係の例外が発生します。
このような現象を回避するのがGenericsです。
Comparatorの匿名クラスを作成する際に、「何(のオブジェクト)に関するComparatorなのか」をコンパイラに教えてやるわけです。そうすることで誤って型の一致しない配列を渡してやってもコンパイルの時点で 検出することが出来ます。
警告を発しないように対処したコードは以下の用になります。
import java.util.*;
public class Test {
public static void sortName(){
String array[] = new String[4];
array[0] = "abba";
array[1] = "abab";
array[2] = "aaaa";
array[3] = "aabb";
Comparator<String> asc = new Comparator<String>() {
public int compare(String obj0, String obj1) {
return obj0.compareTo(obj1);
}
};
Comparator<String> comparator = asc;
Arrays.sort(array, comparator); // 配列をソート
for (int i = 0; i < array.length; i++)
System.out.println(array[i]);
}
public static void main(String[] argv) {
Test.sortName();
}
}
Genericsの別の利点としていちいちキャストしなくてもよくなることがあげられます。 Vector や ArrayList 等を使うときにも何かと便利です。
ArrayList<String> aryString = new ArrayList<String>();
for (int i=0; i<10; i++)
aryString.add("No." + i);
for (int i=0; i<aryString.size(); i++)
System.out.println ( aryString.get(i) ); // キャスト無しで使える
参考URL:http://www.javaworld.jp/technology_and_programmi …
No.1
- 回答日時:
JDKのバージョンを1.5から1.4以下に落とせばエラーは消えるとおもいます。
JDK1.5(JAVA 5.0)から導入されたGenerics により、Object型を使うことによる「何でもOK」を認めない仕様になっています。
必ずString型の変数しか入れないコンパレータならば、
<String>宣言してあげればよろしいかと。
参考URL:http://journal.mycom.co.jp/column/java/021/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- PHP ワードプレスサイト PHP8.0.25でのWarningエラー 1 2023/06/12 11:44
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
おすすめの美術館・博物館、教えてください!
美術館・博物館が大好きです。みなさんのおすすめをぜひお聞きしたいです。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
コーピングについて教えてください
皆さんはストレスを感じたとき、どのような方法や手段、テクニックで対処していますか?
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
総称型ArrayList<E>への参照はパラメ-タ
Java
-
eclipseで1ファイルの警告を100件以上表示させたい。
Java
-
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
-
4
Log4jで機能毎に別ファイルへ出力する方法
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#で動的配列Listの中身をListB...
-
C# ジェネリックメソッドでCSV...
-
多次元配列のソートがうまくい...
-
strutsで2次元配列をやりとりす...
-
sqlparamaterでIN句を使いたい。
-
[Ljava.lang.Stringってなんですか
-
ArrayListからBean配列に値をセ...
-
この警告はどうすれば?
-
Javaで文字を漢字であるか否か...
-
動的配列確保
-
CSVファイルの、列だけ取得したい
-
javamailで複数人にメールを送...
-
配列インデックス範囲外エラー?
-
java StringとString[]の違い
-
javaについて
-
Javaで文字と数字が混ざったも...
-
配列で、値の入っている要素数...
-
【C#】ハッシュテーブル(連想...
-
配列について
-
配列をセッションに割り当てた後で
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
C#で動的配列Listの中身をListB...
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
javaで大容量テキストファイル...
-
ArrayListからBean配列に値をセ...
-
C言語でunsigned char配列を連...
-
main(String[] args) の args...
-
配列の中に複数存在する数がい...
-
javamailで複数人にメールを送...
-
【C#】ハッシュテーブル(連想...
-
同じ配列またはクラスを、2回...
-
Javaで文字を漢字であるか否か...
-
セッションを使ったint型の値の...
-
hit&blow
-
sqlparamaterでIN句を使いたい。
-
n番目に大きな値を探索する
-
配列で、値の入っている要素数...
-
データベースから取得したデー...
-
JavaのBase64デコードで正しく...
おすすめ情報