如何在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);
}
}