2014-09-26 14 views
5

Tôi có điều này:Làm thế nào để biết nếu List.remove() là "Không được hỗ trợ"?

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); 
    } 

} 

Nó cung cấp cho:

$ 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) 

Câu hỏi: Tôi hiểu tại sao tôi nhận được ngoại lệ này. Đó là vì lớp ArrayList từ bên trong Arrays.java đang được sử dụng mà không có phương thức remove(). Câu hỏi của tôi là làm thế nào một người nào đó (bất kỳ người dùng nào, như tôi) biết trước khi sử dụng rằng List họ nhận được rằng nó không chứa một phương pháp remove?

Trả lời

8

Không có cách nào để biết. Tất cả các phương pháp List<T> thay đổi danh sách được liệt kê là tùy chọn. Một phân lớp có thể thực hiện chúng hay không. Rất tiếc, API không bao gồm một phương thức như isReadOnly(), vì vậy không có cách nào để kiểm tra xem các phương thức này có ném ngoại lệ mà không cần gọi chúng hay không.

Chủ sở hữu danh sách chỉ đọc không được chuyển cho các phương pháp sẽ cố gắng thay đổi nó.

0

Arrays.asList trả về mã số List cho array. Trình bao bọc này có kích thước cố định và được hỗ trợ trực tiếp bởi array do đó không thể sửa đổi phương thức. Vì vậy, tốt hơn để ghi nhớ rằng khác tôi không chắc chắn làm thế nào để biết nó bởi vì ít nhất là biên dịch thời gian bạn sẽ không nhận được một lỗi.

Nếu bạn muốn nhận được một Bộ sưu tập từ một mảng để thay đổi bạn có thể sử dụng

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

OP biết điều này. Câu hỏi đặt ra là liệu có bất kỳ cách nào để phát hiện sự thiếu triển khai này mà không biết loại cụ thể của danh sách. – ApproachingDarknessFish

1

Chừng nào giao diện được thực hiện đúng cách, viết một phương pháp loại bỏ mà ném ra một ngoại lệ là hoàn toàn hợp pháp. Vì vậy, không có bạn sẽ không biết cho đến khi nó phá vỡ ... Đó là khi Javadoc có ích.

1

Dưới đây là giải pháp

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); 
    } 
} 

here là một lời giải thích rất tốt cho vấn đề của bạn.

Hy vọng điều này sẽ hữu ích.

+0

Bạn đã quên "Chuỗi" bên trong <> ở đây: 'Danh sách aa = new ArrayList <> (Arrays.asList (giá trị));' – abc

+1

Không không. Đó là 'sự suy giảm kim cương'. Chỉ cho phép trong Java 7 trở lên. Bạn có thể sử dụng nó theo cả hai cách nếu phiên bản java của bạn cao hơn 7. Kiểm tra điều này. http://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7 – codebot

0

Vâng những gì bạn đã làm đó là trực tiếp trở lại như thế này. ví dụ mảng trong cách dễ dàng một cái gì đó như thế này String mảng [] có nghĩa là mảng trở lại của nó bây giờ cho tôi biết là có anyway để loại bỏ yếu tố đó từ đó tôi có nghĩa là từ mảng? thuộc về danh sách chỉ

một cách có thể là.

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. 
    } 
} 
Các vấn đề liên quan