2012-12-20 42 views
5

Tôi đã điều sau đây trong lớp đầu của tôi làm việc như một nét duyên dáng:Java không thể truy cập tài sản lớp đầu trong phương pháp định nghĩa lại lớp con của

public class TestA<E extends Test> 
{ 
     List<Vector<E>> list; 
     String name, location; 

     TestA(String name, String location) 
     { 
      this.name = name; 
      this.location = location; 
      list = new ArrayList<Vector<E>>(); 
     } 

     void populate(Test[] arr) 
     { 
      for(Vector<E> vk : list) 
      { 
        // Code here... 
      } 
     } 

}  

class OrderedTest<E extends Test> extends TestA { 

     OrderedTest(String name, String location) 
     { 
      super(name, location); 
     } 

     void populate(Test[] arr) 
     { 
      for(Vector<E> vk : list) // ERROR: Cannot convert from element Object to Vector<E> 
      { 
        // Code here... 
      } 
     } 

} 

Khi tôi cố gắng để mở rộng populate() trong lớp con của tôi về cơ bản muốn cùng một phương pháp chỉ ở đây tôi muốn những thứ được yêu cầu vì vậy tôi sẽ kéo từng Vector theo phương pháp quicksort nhưng tôi không gặp bất kỳ vấn đề nào khác ngoài: // ERROR: Cannot convert from element Object to

EDIT: Tôi có nên triển khai Iterator cho TestA không?

+1

Tại sao bạn sử dụng 'Vector'? –

+0

Tôi đang đọc một cuốn sách về thuật toán và cấu trúc dữ liệu và chỉ thử nghiệm với những gì tôi đọc. Tôi hiểu Vectors là cũ và dep. –

Trả lời

9

Khi được mã hóa, hai lần sử dụng "E" làm thông số chung là độc lập và bị ngắt kết nối. Vector<E> trong một lớp không có nghĩa là Vector<E> trong một lớp khác.

Thay đổi việc kê khai phân lớp để:

class OrderedTest<E extends Test> extends TestA<E> 

và E trong tờ khai lớp cha là E tương tự như trong OrderedTest.

+0

Bây giờ tôi không cảm thấy ngu ngốc:). Cảm ơn nhiều bạn. –

1

Bạn tuyên bố một Generic

class TestA<E> 

xác định một lĩnh vực loại List < Vector < E>>, có nghĩa là các vector sẽ chứa yếu tố của loại E, mà cũng có nghĩa là nếu bạn không xác định E , khi instantiation của subclassing TestA Vector sẽ là Vector.

Lớp trẻ cũng là một chung được định nghĩa là:

class OrderedTest<E extends Test> extends TestA 

định này generic tái sử dụng chữ 'E' không ràng buộc nó vào lớp cha. Điều đó nói rằng bạn đã không xác định loại cha E loại, và đó là lý do tại sao nó là Object (loại mặc định).

Nếu bạn muốn xác định lớp cha loại tổng quát để được giống như lớp con bạn phải xác định nó như là: để

class OrderedTest<E extends Test> extends TestA<E> 

lưu ý rằng chữ 'E' ở đây không có bất kỳ kết nối với tham số 'E' của cha và có thể là bất kỳ chữ nào vì nó là tham số cho lớp OrderedTest, bạn chỉ quyết định sử dụng tham số kiểu này là tham số xác định tham số kiểu cha. Vì vậy, bạn có thể làm ví dụ:

class OrderedTest<T extends Test> extends TestA<T> 

Điều quan trọng là phải xác định sở hữu kiểu lớp cha với một trong đó sẽ được xác định cho đứa trẻ, vì vậy bạn có thể truy cập vào các trường danh sách mong các kiểu dữ liệu tương tự.

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