如何在java中开始使用泛型类型

如何在java中开始使用泛型类型,java,generics,Java,Generics,我的代码是: class ReferenceRangeBuilder<T extends DvOrderedBuilder> { private DvTextBuilder meaningBuilder; private DvIntervalBuilder<T> rangeBuilder; public ReferenceRangeBuilder() throws ClassNotFoundException, InstantiationException, Il

我的代码是:

class ReferenceRangeBuilder<T extends DvOrderedBuilder> {

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

}

您是否在询问是否可以在构造函数内创建
T
的实例?由于泛型在Java中的实现方式,这些信息在运行时不可用。阅读“类型擦除”了解更多信息

要使这种方法起作用,必须对构建器进行子分类,否则在运行时类型未知

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>();
    }
}
公共类主{
静态类生成器{
私人期末班;
受保护的生成器(){
类型类型=((ParameteredType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
if(类型instanceof Class)
clazz=(类)类型;
其他的
抛出新的断言错误(“生成器需要被子分类为“+type+”未知”);
}
公共类getClazz(){
回击声;
}
}
公共静态void main(字符串…参数){
//当子类记录类型为BigDecimal时,工作正常。
生成器bigDecimalBuilder=新生成器(){
};
System.out.println(bigDecimalBuilder.getClazz());
//不起作用。
生成器bigDecimalBuilder2=新生成器();
}
}
印刷品

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)      
类java.math.BigDecimal
线程“main”java.lang.ClassCastException中出现异常:无法将java.lang.Class转换为java.lang.reflect.ParameterizedType
在Main$Builder(Main.java:21)
Main.Main(Main.java:37)

多亏了大家宝贵的时间和意见,我通过编写这样的构造函数自己解决了这个问题

我的解决办法是:

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);
    }
}
public ReferenceRangeBuilder(claz类){
试一试{
lowerReferenceRange=claz.newInstance();
upperReferenceRange=claz.newInstance();
}catch(实例化异常){
Logger.getLogger(ReferenceRangeBuilder.class.getName()).log(Level.SEVERE,null,ex);
}捕获(非法访问例外){
Logger.getLogger(ReferenceRangeBuilder.class.getName()).log(Level.SEVERE,null,ex);
}
}

您在那里过度编写了OP的更改。@Zutty-它刚刚被回滚。
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);
    }
}