2013-04-18 44 views
8

Tôi đã cố gắng tìm hiểu xem liệu có thể tạo ra một phương thức đưa vào một kiểu generic dựa trên lớp trả về và gọi một phương thức tĩnh của kiểu generic đó không.Java - Phương pháp tĩnh chung

tức là dưới đây tôi tạo 2 lớp, cả hai đều triển khai phương thức getInstances và getAllInstances. Sau đó tôi cố gắng tạo ra sử dụng các phương thức từ một trình bao bọc chung chung. Dường như phương thức siêu hạng luôn được chạy bất kể kiểu trả về.

Ví dụ,

public class ParentClass { 

    public ParentClass(){} 

    public static <T extends ParentClass> T getInstance(){ 
     return (T) new ParentClass(); 
    } 

    public static <T extends ParentClass> List<T> getAllInstances(){ 
     ArrayList<ParentClass> parents = new ArrayList<ParentClass>(); 

     for(int i=0;i<5;i++){ 
      parents.add(new ParentClass()); 
     } 

     return (List<T>) parents; 
    } 

} 

SubclassA

public class SubclassA extends ParentClass{ 

    public SubclassA(){} 

    @SuppressWarnings("unchecked") 
    public static SubclassA getInstance(){ 
     return new SubclassA(); 
    } 

    @SuppressWarnings("unchecked") 
    public static List<SubclassA> getAllInstances(){ 
     ArrayList<SubclassA> parents = new ArrayList<SubclassA>(); 

      for(int i=0;i<5;i++){ 
      parents.add(new SubclassA()); 
      } 

     return parents; 
     } 
} 

Wrapper - Hiển thị vấn đề

public class Wrapper { 

    public Wrapper(){ 
     // ... some other stuff 
    } 

    public <T extends ParentClass> T getInstance(){ 
     return T.getInstance(); 
    } 

    public <T extends ParentClass> List<T> getAllInstances(){ 
     return T.getAllInstances(); 
    } 

    public static void main(String... args){ 
     Wrapper wrapper = new Wrapper(); 

     SubclassA subclassA = wrapper.getInstance(); 
     ParentClass parentClass = wrapper.getInstance(); 

     System.out.println(subclassA.getClass().getName()); 
     System.out.println(parentClass.getClass().getName()); 
    } 

} 

Khi chạy Wrapper tôi nhận được lỗi sau:

Ex lừa dối trong chủ đề "chính" java.lang.ClassCastException: ParentClass không thể được đưa vào SubclassA tại Wrapper.main (Wrapper.java:20)

Tôi có thể làm điều này trong Java không?

+0

không hiểu những gì bạn mong đợi ở đây .... bạn đang gọi một phương thức tĩnh trên một lớp, nó được thực thi. tại sao nó nên ủy quyền cuộc gọi đến một lớp con? và làm thế nào để xác định cái nào? – Gab

+0

Vâng, hy vọng là nó sẽ xác định lớp con nào được ủy quyền bằng cách suy ra từ kiểu trả về. Bây giờ tôi hiểu rằng bạn không thể ghi đè lên các phương pháp tĩnh có ý nghĩa. – user2294382

Trả lời

1

Cách tiếp cận của bạn không chính xác, không có khái niệm về static Inheritance trong Java vì kế thừa luôn luôn ở trong ngữ cảnh cấp đối tượng. Chỉ có các phương thức thành viên (không tĩnh) mới có thể được thừa hưởng bởi các lớp con có các công cụ sửa đổi truy cập thích hợp.

Cập nhật: Hơn nữa để thêm, trong kịch bản của bạn Mẫu nhà máy có vẻ phù hợp hơn so với việc điều chỉnh Generics để nhận/xây dựng các đối tượng lớp cụ thể.

2

phương pháp tĩnh sẽ không override.This static phương pháp sẽ thuộc về Class mức

1

Không, bạn không thể làm điều đó như thế này. Để làm cho nó hoạt động, bạn có thể vượt qua đối tượng Class:

public class ParentClassUtils 

    public static <T extends ParentClass> T getInstance(Class<T> clazz) { 
     return clazz.newInstance(); 
    } 

    public static <T extends ParentClass> List<T> getAllInstances(Class<T> clazz) { 
     List<T> list = new ArrayList<T>(); 
     for (int i = 0; i < 5; i++) { 
      list.add(getInstance(clazz)); 
     } 
     return list; 
    } 
} 

Ngoài ra, trong ví dụ của bạn, bạn có phương thức tĩnh tương đương trong lớp cha và lớp con. Các phương thức lớp con không ghi đè lên các phương thức lớp cha, chúng chỉ ẩn chúng, và điều này gần như chắc chắn không phải là những gì bạn muốn. Cách tiếp cận lớp tiện ích này ở trên được xung quanh điều này.

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