2013-04-18 13 views
8

Jenerik Statik Yöntemler.Java - Bunun dönüş sınıfına dayalı bir genel tür algılar ve bu jenerik türde bir statik yöntemini çağıran bir yöntem yapmak mümkün olup olmadığını anlamaya çalışıyorlar

yani I2 sınıflar hem getInstances ve getAllInstances yöntemleri uygulamak oluşturmak görebilirsiniz. Daha sonra, genel bir sarıcıdan yöntemleri kullanmaya çalışıyorum. Süper sınıf yönteminin her zaman dönüş türünden bağımsız olarak çalıştırıldığı anlaşılmaktadır. Örneğin

,

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

Sarıcı - problemi gösterir

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

} 

aşağıdaki hatayı alıyorum Sarıcısını çalıştırırken:

EX "ana" java.lang.ClassCastException parçasında ception: ParentClass, Wrapper.main adresindeki SubclassA 'a dökülmez (Wrapper.java:20)

Bunu Java'da yapabilir miyim?

+0

bir sınıfa statik yöntemi çağırmak ediyoruz .... burada bekliyoruz anlamıyorum, yürütüldüğünde. çağrıyı neden bir alt sınıfa devretmeli? ve hangisini belirlemek için? – Gab

+0

Umarım, dönüş türünden çıkarım yaparak hangi alt sınıfa verileceğini belirlerdi. Şimdi anladığım kadarıyla statik yöntemleri geçersiz kılabilirsiniz. – user2294382

cevap

1

Kişisel yaklaşım miras daima Nesne düzeyinde bağlamında olduğu gibi Java statik Inheritance hiçbir kavramı yoktur, yanlıştır. Uygun erişim değiştiricilere sahip alt sınıflar tarafından yalnızca üye yöntemleri (statik olmayan) alınabilir.

Güncelleme: Ek olarak, senaryoda Fabrika kalıbı belirli sınıf nesnelerini almak/oluşturmak için jenerikleri ayarlamaktan daha uygun görünüyor.

2

statik yöntemler olacak Class seviyesinde

1

yok aittir static yöntemler, böyle yapamazsın override.This olmayacaktır. Eğer Sınıf nesnesi iletebilirsiniz çalışması için:

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

Ayrıca, örnekte Üst sınıflar ve alt sınıflar eşdeğer statik yöntemleri var. Alt sınıf yöntemleri, üst sınıf yöntemlerini geçersiz kılmaz, yalnızca onları gizler ve bu neredeyse istediğiniz gibi değildir. Yukarıdaki bu faydalı sınıf yaklaşımı bu konuyla ilgilenir.