2012-03-20 14 views
12

Geçirilen Sınıf nesnesinin aynı türünde bir nesnenin bir örneğini döndürmek istiyorum. Geçirilen tür HERHANGİ BİR SAYFA olabilir. Bunu Generics ile yapmanın bir yolu var mı? Java 6 kullanılarak geçirilen sınıfla aynı türde bir nesnenin bir örneğini nasıl döndürebilirim?

netleştirmek için - Onların Örneğin

geçirilen nesnenin Sınıf yayın yapmak için yok etmek yöntemin arayan istemiyoruz,

public Object<Class> getObject(Class class) 
{ 
    // Construct an instance of an object of type Class 

    return object; 
} 

// I want this: 
MyClass myObj = getObject(MyClass.class); 

// Not this (casting): 
MyClass myObj = (MyClass)getObject(MyClass.class); 

cevap

14

Bunu sınıfın yeni bir örneğini oluşturmak istediğiniz varsayalım. Bu, jenerikler (new T()'u arayamazsınız) kullanarak mümkün olmazdı ve yansıma kullanılarak da oldukça sınırlı olurdu.

yansıma yaklaşım olabilir: bu sadece çalışır sınıf no-argüman yapıcı varsa o

//class is a reserved word, so use clazz 
public <T> T getObject(Class<T> clazz) { 
    try { 
    return clazz.newInstance(); 
    } 
    catch(/*a multitude of exceptions that can be thrown by clazz.newInstance()*/) { 
    //handle exception 
    } 
} 

Not. Bununla birlikte, soru
new WhatEverClassYouHave()'u aramak yerine neden buna ihtiyacınız olabilir.

+0

Oyuncular gerekli değil. – Puce

+0

@Puce haklısın :) – Thomas

+0

Döküm gerekli gibi görünüyor (bu bir hata var) – BestPractices

-1
public Object getObject(Class clazz) { 
    return clazz.newInstance(); 
} 

Will Belirtilen sınıfın yeni bir nesnesini oluşturmak. Bunun için jenerik kullanmanız gerekmez.

+0

Sen daha sonra atmak istemiyorsanız, Generics kullanmak zorunda. – Puce

+0

Puce, daha sonra yayınlamak istemediğimi söyledi ... – BestPractices

+0

evet, sorunuzu daha sonra düzenlediniz - Sınıf jenerik, bu yüzden Chuck'ın yayınladığı şeyi kullanabilirsiniz. – manub

4
public <C> C getObject(Class<C> c) throws Exception 
{ 
    return c.newInstance(); 
} 

Kullanımı Örnek:

static <C> C getObject(Class<C> c) throws Exception { 
    return c.newInstance(); 
} 

static class Testing { 
    {System.out.println("Instantiated");} 
    void identify(){ System.out.println("Invoked"); } 
} 

public static void main(String args[]) throws Exception { 
    Testing t = getObject(Testing.class); 
    t.identify(); 
} 
+0

Ancak bu yöntem hiçbir şey eklemiyor ... – Puce

+0

@Puce - Kullanım örneğini düzenleyip ekleyeceğim. Bekleyin ... – Java42

+0

Yine de getObject hiçbir şey eklemiyor. Basitçe kullanabilirsiniz: Test t = Testing.class.newInstance(); ve getObject yönteminden kurtulun – Puce

1

Eğer oluşturulması sırasında nesne ile süslü bir şey yapmaya çalışıyor değilseniz, sadece iyi bir eski moda kurucular kullanarak nesi var?

Sen benzer bir şey kullanmak gerekir:

public T getObject<T>(T obj) 
{ 
    return obj.newInstance(); 
} 
İlgili konular