2010-07-24 30 views
10

Tôi đã cố gắng viết hàm chung loại bỏ các phần tử trùng lặp khỏi mảng.Làm thế nào để tham số kiểu chung nói "mở rộng" Không thể so sánh "thực hiện"?

public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) { 
    //do quicksort 
    Arrays.sort(arr); 
    ArrayList<E> list = new ArrayList<E>(); 
    int i; 
    for(i=0; i<arr.length-1; i++) { 
     if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list 
      list.add(arr[i]); 
     } 
    } 
    list.add(arr[i]); //add last element 
    return list; 
} 

Như bạn có thể thấy bạn không thể chuyển kiểu nguyên thủy như int] mảng vì tôi so sánh các phần tử bằng phương thức compareTo() được xác định trong giao diện Comparable.

tôi nhận thấy dòng đầu tiên (phương pháp kê khai):

public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) { 

Tại sao nó nói "kéo dài tương đương"?

So sánh là một giao diện vậy tại sao nó không "triển khai So sánh"? Đây là lần đầu tiên tôi viết chức năng chung nên tôi hơi bối rối về những chi tiết như vậy. (bất kỳ thắc mắc nào sẽ ngăn tôi không hiểu ..)

EDIT: Tìm thấy bài viết này liên quan đến chủ đề này.

http://www.tutorialspoint.com/java/java_generics.htm

+2

vì 'thực hiện mở rộng kéo dài ' –

+0

Có thể trùng lặp của [Generics Java - tại sao" mở rộng T "được cho phép nhưng không" triển khai T "?] (Http://stackoverflow.com/questions/976441/java-generics-why -is-extends-t-allowed-but-not-implements-t) – Lii

Trả lời

5

Nếu bạn muốn sử dụng điều mà thực hiện Bạn chỉ cần wirte là như generic tham số

class Bar extends Foo<String> { /* Code */} 

Các ký tự đại diện mà bạn đang nói về ba

  1. "kéo dài Gõ?": Biểu thị một họ các kiểu con của kiểu Type. Đây là ký tự đại diện hữu ích nhất
  2. "siêu Loại?": Biểu thị một gia đình siêu kiểu loại Loại
  3. "?": Biểu thị các thiết lập của tất cả các loại hoặc bất kỳ

Bạn phương pháp nên trông giống như

public static <T extends Comparable<? super T>> Collection<T> sort(T[] list) { 

     Collection<T> list = new ArrayList<T>(); 

     //do quicksort 
     Arrays.sort(arr); 

     Collection<T> list = new ArrayList<T>(); 
     int i; 
     for(i=0; i<arr.length-1; i++) { 
      if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list 
       list.add(arr[i]); 
      } 
     } 
     list.add(arr[i]); //add last element 
//btw how do You know that last is not duplicate 
     return list; 

} 

Đối với lời cầu khẩn detali thăm this page

+0

Cảm ơn lời khuyên. Trả lời cho câu hỏi của bạn, "làm thế nào để tôi biết người cuối cùng không trùng lặp": Nếu mảng được sắp xếp bao gồm A, B, B 1. Tôi đặt A vào danh sách. 2. Bỏ qua giây B kể từ chỉ mục [1] và chỉ mục [1 + 1] giống nhau. 3. Ra khỏi vòng lặp. 4. Thêm chỉ mục cuối cùng (cuối cùng là B) –

1

Đối với một điều, E có thể là một giao diện.

+2

Đây chỉ là một câu. –

+5

Tất nhiên đó là một câu. Nó có một chủ đề, động từ và đối tượng. Nó cũng là một câu trả lời đúng. Vấn đề của bạn là gì? – EJP

10

Đây là chỉ là quy ước được chọn cho Generics. Khi sử dụng các tham số kiểu bounded bạn sử dụng extends (mặc dù nó có thể có nghĩa là thực hiện trong một số trường hợp) hoặc super.

Bạn thậm chí có thể làm điều gì đó như <E extends Comparable<E> & Cloneable> để xác định rằng đối tượng sẽ thay thế thông số loại nên triển khai cả hai giao diện đó.

Các vấn đề liên quan