2017-03-15 7 views
0

最終変数EX_FIELDSに変更不可能なArrayListを取得しようとしています。 exListは既存のArrayListオブジェクトです。ArrayListを変更不可能なArrayListに変換する

EX_FIELDS = (ArrayList<String>) Collections.unmodifiableList(exList); 

このコードは、静的block.Whenクラスのロード中に存在している、私は次のエラーを取得します。 「タイプList<String>、ないArrayList<String>を持っている必要があり

答えて

8

EX_FIELDS

java.lang.ClassCastException: java.util.Collections$UnmodifiableRandomAccessList cannot be cast to java.util.ArrayList 

私はそこにそれを達成するには?任意の助けてくれてありがとうを事前に他の方法をランダムaccess.IsをサポートするためにEX_FIELDSを使用する必要がある、とあなたはするべきでありませんtは任意のキャストを実行する必要があります。あなただけのこれはあなたがインターフェイスではなく、実装するためのプログラムすべきはるかに一般的なルールの1つのインスタンスである

EX_FIELDS = Collections.unmodifiableList(exList); 

書く必要があります。

+0

おそらく 'RandomAccessList'は関連しています - 静的メソッドは区別を保持します。 – chrylis

+0

私は定期的なランダムアクセスのためにリストを使用しようとしているので、効率的だと思った。 – amudhan3093

+0

@ amudhan3093 'List'インターフェースを使用してください。実装を信頼してください。これがベストプラクティスです。 –

2

Collections.unmodifiableList()がArrayListを返さないため、ClassCastExceptionが発生します。これは、List<T>(インターフェイス)を返します。これは、Listインターフェイスを実装する任意のバッキングクラスです。例外からわかるように、実際にはUnmodifiableRandomAccessListです。あなたがある

List<String> EX_FIELDS = new ArrayList<>(); 

のようにそれを宣言する必要がありEX_FIELDS変数を作成すると

は、EX_FIELDSは一覧ですし、実際のインスタンスのためにArrayListのを選択しました。その後、あなたは

EX_FIELDS = Collections.unmodifiableList(exList); 

unmodifiableList()をやるにしてリストを返しますが、あなたが実際にそれをどのような種類を気にしない限り、それはリストインターフェースに準拠したとして、です。

0

他の回答は正しいものの、重要な点がありません。この方法で作成された変更不可能なリストは変更できます。

コレクションクラスへのこの呼び出しは、提供EXLIST引数を包むラッパーオブジェクトを作成します。

つまり、exListが変更されると、ラップされたリストも同様に変更されます。

本当に確かめたい場合は、最初に新しい一時リストを作成し、のすべてのエントリを追加する必要があります。exList;そのコレクションメソッドを使用してその一時的なコピーをラップします。

+0

私はそれをEX_FIELDS = Collectionsとして渡すべきです。unmodifiableList(new ArrayList (exList));今は参照が維持されるように? – amudhan3093

+0

私はそう思っていますが(しかし、ArrayListコンストラクタが実際にコピーを作成するかどうかは100%確信していません...だから、確かめたいのであれば、ソースをチェックアウトしてください)。ニースの質問BTW。 – GhostCat

関連する問題