2012-12-06 30 views
0

我的代碼是:如何在Java中使用泛型類型發起

class ReferenceRangeBuilder<T extends DvOrderedBuilder> { 

private DvTextBuilder meaningBuilder; 
private DvIntervalBuilder<T> rangeBuilder; 
    public ReferenceRangeBuilder() throws ClassNotFoundException, InstantiationException, IllegalAccessException { 

} 

}

我想發起rangeBuilder,這樣我可以設定值進去。 我想在構造函數裏面做。 爲DvIntervalBuilder rangeBuilder我做到了,如:

public DvIntervalBuilder() throws NoSuchFieldException, InstantiationException, IllegalAccessException, ClassNotFoundException { 
     ParameterizedType pt = (ParameterizedType) getClass().getGenericSuperclass(); 
     // You may need this split or not, use logging to check 
     String parameterClassName = pt.getActualTypeArguments()[0].toString().split("\\s")[1]; 

     T lower = (T) Class.forName(parameterClassName).newInstance(); 
     T upper = (T) Class.forName(parameterClassName).newInstance(); 

    } 
+1

你已經過寫的OP的變化有獅子。 – Zutty

+0

@Zutty - 它剛剛回滾。 – Lion

回答

1

我解決了這個問題我自己寫一個構造函數就是這樣,感謝所有的時間居停和意見。

我的解決方案是:

public ReferenceRangeBuilder(Class<T> claz) { 
    try { 
     lowerReferenceRange = claz.newInstance(); 
     upperReferenceRange = claz.newInstance(); 
    } catch (InstantiationException ex) { 
     Logger.getLogger(ReferenceRangeBuilder.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     Logger.getLogger(ReferenceRangeBuilder.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
0

要使此方法起作用,必須對構建器進行子分類,否則該類型在運行時未知。

public class Main { 
    static class Builder<T> { 
     private final Class clazz; 

     protected Builder() { 
      Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
      if (type instanceof Class) 
       clazz = (Class) type; 
      else 
       throw new AssertionError("Builder needs to be sub-classed as " + type + " is unknown"); 
     } 

     public Class<T> getClazz() { 
      return clazz; 
     } 
    } 

    public static void main(String... args) { 
     // works fine as sub-class records that the type is BigDecimal. 
     Builder<BigDecimal> bigDecimalBuilder = new Builder<BigDecimal>() { 
     }; 
     System.out.println(bigDecimalBuilder.getClazz()); 
     // doesn't work. 
     Builder<BigDecimal> bigDecimalBuilder2 = new Builder<BigDecimal>(); 
    } 
} 

打印

class java.math.BigDecimal 

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 
    at Main$Builder.<init>(Main.java:21) 
    at Main.main(Main.java:37)