2014-06-08 36 views
5

ile özet sınıfının nesnesini yaratın Hey çocuklar bana yardım edeceğinizi umuyordu.jenerik tip

Temel olarak, genel bir türle bir işlev oluşturuyorum ve bu genel tür, başlatmam gereken soyut bir türdür. Bu kod daha net açıklayacaktır:

public <T extends AbstractRow> foo(){//no I did not actually name the function foo 
    ArrayList<T> arr=new ArrayList<T>(); 
    arr.add(new T(...)); //cant instantiate objects of abstract class 


} 

Temelde "T AbstractRow uzanır ama kendisi Özet değil" zorlamak istiyorum

Sana soyut sınıfları örneğini olamaz fark, bu yüzden bir istiyorum genel bir türden bir nesne oluşturma davranışını taklit etmeme izin veren bir geçici çözüm veya başka bir yöntem hakkında öneri. Teşekkür peşin

+0

Eğer soyut yöntemlerin hepsi uygulamak sürece soyut bir sınıf örneğini olamaz. – user184994

+0

Bunu farkettim. Genel türlerini doğrudan ne zaman oluşturabileceğinizden beri, genel bir tür –

+0

Guys nesnesinin bir nesnesini başlatmam gereken bir uygulama çalışması yapmak için bir 'geçici çözüm' ya da bir fikre ihtiyacım var? – drewmoore

cevap

3

Ana meseleniz, soyut bir sınıfla çalıştığınız değil - bu durumda yorumlarda yer alan önerilerin işe yarayacağı anlamına gelir. Daha büyük bir sorun, genel bir tür (örneğin: new T()) türünü başlatmaya çalıştığınızdır. Bu, sadece type erasure nedeniyle Java'da yapamazsınız.

/**@param clazz the subclass you want to instantiate */ 
public <T extends AbstractRow> foo(Class<T> clazz) { 
    ArrayList<T> arr = new ArrayList<T>(); 
    arr.add(clazz.newInstance); //instantiate new instance of given subclass 
} 

Kullanımı:

abstract class Test1 {} 
class Test2 extends Test1{ } 

class Test<T> { 
    public static <T extends Test1> T foo(Class<T> clazz) { 
    T toReturn = null; 
    try{ toReturn = clazz.newInstance(); } catch (Exception e) { }; 
    return toReturn ; 
    } 

    public static void main(String[] args) { 
    Test1 t1 = t.foo(test2.class); 
    System.out.println(t1.getClass()); //prints "class pkgname.test2" 
    } 
} 
4

olarak bildiğim kadarıyla, bunu yapmak için iki yol vardır:

  1. bir Class<T> type ekle söyledi

    , hep bir çözüm bulunmamaktadır soyut genel sınıfınıza gidin ve kurucudan (veya başka bir yöntemden) ayarlayın. Nesneyi oluşturmak için type.newInstance()'u çağırabilirsiniz.
  2. T create() yöntemiyle Factory<T> fabrika arabirimi oluşturun ve bunu yapıcı (veya başka bir yöntemle) aracılığıyla soyut sınıfınızda bir alan olarak ayarlayın. Genel sınıfınızın somut bir örneğini oluşturduktan sonra, söz konusu fabrikanın somut bir uygulamasını da geçmek zorundasınız.
import java.util.ArrayList; 
import java.util.List; 

public class Generic<T> { 
    private Factory<T> factory; 

    public Generic(Factory<T> factory) { 
     this.factory = factory; 
    } 

    public void foo() { 
     List<T> list = new ArrayList<>(); 

     list.add(factory.create()); 
    } 
} 

interface Factory<T> { 
    T create(); 
} 

Kullanımı:

Generic<Bar> concrete = new Generic<>(new Factory<Bar>() { 
    @Override 
    public Bar create() { 
     return new Bar(); 
    } 
}); 

concrete.foo();