web-dev-qa-db-ja.com

List <>からArrayList <>をキャストする方法

誰かが私にキャストできない理由を説明してもらえますかList<>からArrayList<>最初のアプローチで、私は2番目のアプローチで?ありがとうございました。

最初のアプローチ:

ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token));

2番目のアプローチ:

ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));
38
Eugene

2番目のリストを作成するとき、新しいarraylistを作成していますが、もう1つのリストがarraylistであると偽装しようとはしていません。

つまり、元のリストがリンクされたリスト、またはカスタムリストとして実装されている場合はどうでしょうか。わかりません。結果からarraylistを作成する必要がある場合は、2番目のアプローチが推奨されます。ただし、リストとしてそのまま残すことができます。これは、インターフェースを使用する最大の利点の1つです。

29
corsiKa

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

13
Harsh

キャストする場合、2番目のアプローチは明らかに間違っています。新しいArrayListをインスタンス化します。

ただし、getAllTask​​sがArrayListを返す場合にのみ、最初のアプローチは問題なく機能します。

ArrayListを持つことが本当に必要ですか? Listインターフェースでは不十分ですか?タイプが正しくない場合、実行していることでランタイム例外が発生する可能性があります。

GetAllTask​​s()がArrayListを返す場合、クラス定義の戻り値の型を変更する必要があります。キャストする必要はありません。他の何かを返す場合は、ArrayListにキャストできません。

5
krtek

これを試してください:

ArrayList<SomeClass> arrayList;

 public SomeConstructor(List<SomeClass> listData) {
        arrayList.addAll(listData);
}
4
vikas kumar

最初のアプローチはリストをキャストしようとしていますが、これはList<>ArrayList<>。そうではありません。したがって、2番目のアプローチが必要です。それは、新しいArrayList<>の要素を持つList<>

2
jdehaan

何をしているのか理解していれば、List <>をArrayList <>にキャストできます。 Javaコンパイラーはブロックしません。

しかし:

  1. チェックせずに親タイプを子タイプ(または実装タイプへのインターフェース)にキャストするのは悪い習慣です。この方が良い:

if (list instanceof ArrayList<Task>) { ArrayList<Task> arraylist = (ArrayList<Task>) list; }

  1. おそらく、参照として実装タイプは必要ありません。 SonarQubeの警告を見てください https://sbforge.org/sonar/rules/show/squid:S1319 。ほとんどの場合、このキャストを回避できます。
  2. Guavaメソッドを使用できます:ArrayList<Task> arraylist = Lists.newArrayList(list);
2
Atetc

最初のものでは、コレクションをArrayListに変換しようとしているためです。 2番目では、 ArrayListのコンストラクターに組み込まれています を使用します。

1
Yossale

次のコードを実行してみてください。

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へ、またはその逆へのキャストは無関係であり、使用できません。

1
rebulanyum

多分:

ArrayList<ServiceModel> services = new ArrayList<>(parking.getServices());
intent.putExtra("servicios",services);
0
Rolfy Montufar