誰かが私にキャストできない理由を説明してもらえますかList<>
からArrayList<>
最初のアプローチで、私は2番目のアプローチで?ありがとうございました。
最初のアプローチ:
ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token));
2番目のアプローチ:
ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));
2番目のリストを作成するとき、新しいarraylistを作成していますが、もう1つのリストがarraylistであると偽装しようとはしていません。
つまり、元のリストがリンクされたリスト、またはカスタムリストとして実装されている場合はどうでしょうか。わかりません。結果からarraylistを作成する必要がある場合は、2番目のアプローチが推奨されます。ただし、リストとしてそのまま残すことができます。これは、インターフェースを使用する最大の利点の1つです。
2番目のアプローチを使用している場合、事前定義された値でarraylistを初期化しています。通常のように、ArrayList listofStrings = new ArrayList <>();値を持つ配列があり、この配列をarraylistに変換するとします。
まず、Arrays utilsを使用して配列からリストを取得する必要があります。 ArrayListはListインターフェイスを実装する具象型であるためです。メソッドasListがこのタイプの実装を返すことは保証されません。
List<String> listofOptions = (List<String>) Arrays.asList(options);
次に、arraylistのconstructoruを使用して、事前定義された値でインスタンス化できます。
ArrayList<String> arrlistofOptions = new ArrayList<String>(list);
したがって、2番目のアプローチは、リスト要素でarraylistをインスタンス化する値を渡したということです。
もっと
Arrays.asListから返されるArrayListは実際のarraylistではなく、リスト内の変更を許可しない単なるラッパーです。 Arrays.asListを追加または削除しようとすると、
UnsupportedOperationException
キャストする場合、2番目のアプローチは明らかに間違っています。新しいArrayListをインスタンス化します。
ただし、getAllTasksがArrayListを返す場合にのみ、最初のアプローチは問題なく機能します。
ArrayListを持つことが本当に必要ですか? Listインターフェースでは不十分ですか?タイプが正しくない場合、実行していることでランタイム例外が発生する可能性があります。
GetAllTasks()がArrayListを返す場合、クラス定義の戻り値の型を変更する必要があります。キャストする必要はありません。他の何かを返す場合は、ArrayListにキャストできません。
これを試してください:
ArrayList<SomeClass> arrayList;
public SomeConstructor(List<SomeClass> listData) {
arrayList.addAll(listData);
}
最初のアプローチはリストをキャストしようとしていますが、これはList<>
はArrayList<>
。そうではありません。したがって、2番目のアプローチが必要です。それは、新しいArrayList<>
の要素を持つList<>
何をしているのか理解していれば、List <>をArrayList <>にキャストできます。 Javaコンパイラーはブロックしません。
しかし:
if (list instanceof ArrayList<Task>) { ArrayList<Task> arraylist = (ArrayList<Task>) list; }
ArrayList<Task> arraylist = Lists.newArrayList(list);
最初のものでは、コレクションをArrayListに変換しようとしているためです。 2番目では、 ArrayListのコンストラクターに組み込まれています を使用します。
次のコードを実行してみてください。
List<String> listOfString = Arrays.asList("Hello", "World");
ArrayList<String> arrayListOfString = new ArrayList(listOfString);
System.out.println(listOfString.getClass());
System.out.println(arrayListOfString.getClass());
次の結果が得られます。
class Java.util.Arrays$ArrayList
class Java.util.ArrayList
したがって、それらは、互いに拡張していない2つの異なるクラスであることを意味します。 Java.util.Arrays $ ArrayListはArrayListという名前のプライベートクラス(Arraysクラスの内部クラス)を示し、Java.util.ArrayListはArrayListという名前のパブリッククラスを示します。したがって、Java.util.Arrays $ ArrayListからJava.util.ArrayListへ、またはその逆へのキャストは無関係であり、使用できません。
多分:
ArrayList<ServiceModel> services = new ArrayList<>(parking.getServices());
intent.putExtra("servicios",services);