2015-10-15 32 views
0

我試圖做這樣的事情: -如何獲取參數化類中的一個對象在Java中

public interface Parseable { 
    String execute(); 
} 
public interface Adaptable<P> { 
    String execute(); 
} 
public class Parser1 implements Parseable{ 

    @Override 
    public String execute() { 
     return "Parser1"; 
    } 

} 
public class Parser2 implements Parseable{ 

    @Override 
    public String execute() { 
     return "Parser2"; 
    } 

} 
public class Adapter1<P extends Parseable> implements Adaptable<P>{ 
    private P p; 

    public Adapter1(Class<Parseable> clazz){ 
     try { 
      p=(P) clazz.newInstance(); 
     } catch (InstantiationException ex) { 
      Logger.getLogger(Adapter1.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      Logger.getLogger(Adapter1.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    @Override 
    public String execute() { 
     return "Adapter1 "+p.execute(); 
    } 

} 
public class Adapter2<P extends Parseable> implements Adaptable<P>{ 
    private P p; 

    public Adapter2(Class<Parseable> clazz){ 
     try { 
      p=(P) clazz.newInstance(); 
     } catch (InstantiationException ex) { 
      Logger.getLogger(Adapter2.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      Logger.getLogger(Adapter2.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    @Override 
    public String execute() { 
     return "Adapter2 "+ p.execute(); 
    } 

} 
public class HelloGenerics<T extends Adaptable, P extends Parseable> { 
    private T t; 
    private P p; 
    public HelloGenerics(Class<T> clazz, Class<P> clz){ 
     try { 
      t=(T) clazz.getConstructors()[0].newInstance(clz); 
      p=(P) clz.getConstructors()[0].newInstance(); 
     } catch (InstantiationException ex) { 
      Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IllegalArgumentException ex) { 
      Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InvocationTargetException ex) { 
      Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (SecurityException ex) { 
      Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     HelloGenerics<Adapter1<P>, Parser1> h1; 
     h1 = new HelloGenerics<>(Adapter1<P>.class, Parser1.class); 
     h1.t.execute(); 
    } 

} 

但這似乎可能並不如NetBeans是標誌着主要以線條爲錯誤說服力預期。 這只是我寫的一個演示代碼來學習反射,所以這個問題純粹是學術性的,其主要目的是學習如何獲取參數化類的類對象。我實際上試圖做的是讓課程可以互換。例如。我應該能夠根據需要將Parser1或Parser2傳遞給任何一個適配器。 在此先感謝。

回答

1

讓它成爲一個具體的類。

public Adapter1(Class<P> clazz){ 
    try { 
     p = clazz.newInstance(); 
    } catch (InstantiationException | IllegalAccessException ex) { 
     Logger.getLogger(Adapter1.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
0

試試這個:

public Adapter1(){ 
    ParameterizedType type = (ParameterizedType) getClass() 
      .getGenericSuperclass(); 
    Class<?> clazz = (Class<?>) type.getActualTypeArguments()[0]; 
    try { 
     T t = (T) clazz.newInstance(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
} 
相關問題