2014-09-26 12 views
5

Ich habe dies:Wie kann man wissen, ob List.remove() "nicht unterstützt" ist?

import java.util.Arrays; 
import java.util.List; 
import java.util.ArrayList; 
public class ListTest { 

    public static void main(String[] args) { 


     String[] values = { "yes", "no"}; 
     List<String> aa = Arrays.asList(values); 
     System.out.println(aa.getClass().getName()); 
     aa.remove(0); 
    } 

} 

Es gibt:

$ java ListTest 
java.util.Arrays$ArrayList 
Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(AbstractList.java:161) 
    at ListTest.main(ListTest.java:12) 

Frage: Ich verstehe, warum ich diese Ausnahme immer bin. Es ist, weil die ArrayList Klasse von innen Arrays.java verwendet wird, die keine remove() Methode hat. Meine Frage ist, wie kann jemand (jeder Benutzer, wie ich) vor der Verwendung wissen, dass die List erhalten, dass es keine remove Methode enthält?

Antwort

8

Es gibt keine Möglichkeit zu wissen. Alle List<T> Methoden, die die Liste ändern, werden als optional aufgeführt. Eine Unterklasse kann sie implementieren oder nicht. Leider enthält die API keine Methode wie isReadOnly(), daher gibt es keine Möglichkeit zu überprüfen, ob diese Methoden Ausnahmen auslösen, ohne sie aufzurufen.

Es liegt in der Verantwortung des Eigentümers der schreibgeschützten Liste, diese nicht an Methoden zu übergeben, die versuchen, sie zu ändern.

0

Arrays.asList gibt einen List Wrapper für einen array zurück. Dieser Wrapper hat eine feste Größe und wird direkt von der array unterstützt, daher kann es keine Modifizierungsmethoden geben. Es ist also besser, daran zu denken, dass ich sonst nicht sicher bin, wie ich es wissen soll, denn zumindest zur Kompilierzeit werden Sie keinen Fehler bekommen.

Wenn Sie eine Sammlung aus einem Array erhalten möchten ändern können Sie

Collection c = new ArrayList(Arrays.asList(values)); 
+0

Das OP weiß das. Die Frage war, ob es einen Weg gab, diesen Mangel an Implementierung zu erkennen, ohne den konkreten Typ der Liste zu kennen. – ApproachingDarknessFish

1

verwenden, solange die Schnittstelle richtig implementiert ist, ein Entfernen Methode zu schreiben, die eine Ausnahme auslöst ist völlig legal. Also, nein, du wirst es nicht wissen bis es bricht ... Dann ist Javadoc praktisch.

1

Hier ist die Lösung

import java.util.Arrays; 
import java.util.List; 
import java.util.ArrayList; 
class ListTest { 
    public static void main(String[] args) { 
     String[] values = { "yes", "no"}; 
     List<String> aa = new ArrayList<>(Arrays.asList(values)); 
     System.out.println(aa.getClass().getName()); 
     aa.remove(0); 
    } 
} 

und here ist eine sehr gute Erklärung für Ihr Problem.

Hoffe, das hilft.

+0

Haben Sie "String" innerhalb <> hier vergessen: 'Liste aa = neue ArrayList <> (Arrays.asList (Werte));' – abc

+1

Nein nein. Das ist "Diamant-Unfruchtbarkeit". Erlaubt nur in Java 7 und höher. Sie können es auf beide Arten verwenden, wenn Ihre Java-Version höher als 7 ist. Überprüfen Sie dies. http://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7 – codebot

0

Nun, was Sie getan haben, ist direkt wie folgt zurück. Ex. Array in einfacher Weise etwas wie dieses String-Array [] bedeutet, seine Rückkehr Array jetzt sagen Sie mir, ist es sowieso, um das Element aus dem ich meine aus dem Array zu entfernen? das gehört nur aus der liste

ein möglicher weg ist.

import java.util.List; 
import java.util.ArrayList; 
import java.util.Arrays; 

class ListTest { 
    public static void main(String[] args) { 
     String[] values = { "yes", "no"}; 
     List<String> aa = new ArrayList<>(Arrays.asList(values)); // this will return arraylist (according that u wanted). 
     System.out.println(aa.getClass().getName()); 
     aa.remove(0); // removes element as of list interface have remove method. 
    } 
}