それが原因でJVMがジェネリックを提供する方法のために動作しません。 JavaのGenericsは、実行時に生の型の使用とキャストになるフロントエンドのコンパイラ機能です。
ジェネリックを使用するとコンパイラは何をしていますか?
これは非常に工夫した例です。のは、私は、後にそうように、との新しいプロセスをキックオフするために使用するコマンドライン引数を格納するList<String>
を作成したいとしましょう:
List<String> cmd = new ArrayList<>();
cmd.add("java");
cmd.add("-jar");
cmd.add("path/to/my.jar");
...
String args = cmd.get(0)+" "+cmd.get(1)+" "+cmd.get(2);
コンパイル時に、コンパイラは私がいることを確認するためにチェックしますcmd
経由で汎用List
メソッドを使用するたびにString
タイプを使用し、互換性のないタイプのインスタンスを使用しようとするとエラーが発生します。しかし、実行前にコンパイル中に発生する、消し器と呼ばれる小さなものがあります。効果的に、ボンネットの下に、コンパイラはこのようなものの中に上記のコードを変換します
List cmd = new ArrayList();
cmd.add("java");
cmd.add("-jar");
cmd.add("path/to/my.jar");
...
String args = (String)cmd.get(0)+" "+(String)cmd.get(1)+" "+(String)cmd.get(2);
、なぜ私の一般的な配列のコードはコンパイルされませんか?あなたの例では
、あなたがそうのように、ジェネリック型の配列を作成したい:問題は、型消去の、ある
ArrayList<FloatList>[][] array = new ArrayList<FloatList>[n][m]; //Doesn't compile? What gives?
、ArrayList<FloatList>
クラス型が実際に存在していない、と今では、存在しないタイプの2次元配列を作成するようにJVMに依頼しました。
これで代替手段はありますか?
は、うーん...それはかなりありませんが、このような何かを行うことができます:この周り
class ArrayListOfFloatList extends ArrayList<FloatList>{
...
}
//Somewhere else in your code:
ArrayListOfFloatList[][] myArray = new ArrayListOfFloatList[n][m];
//This will compile because ArrayListOfFloatList is a real class.
唯一の他の方法は、配列を使用しないことであろう。醜いですが、残念ながらJavaが現在どのように実装されているかの限界です。
'ArrayList [] [] values = new ArrayList [3] [3];'しかし概念的には、これはあまりにも複雑になり始めます。 –
Compass
私は2D行列を持ち、各四角形内には未知の量のカテゴリがあります。カテゴリ内で一連の値が保持されます。行列が完成すると、各カテゴリの中央値が見つけられて表示されます。 – jackoverflow
多めのテキストで更新しました。基本的に、あなたは何かの配列をインスタンス化しています。 – Compass