我使用 Java 8。在我的设计中,有一些简单的类对值参数进行建模,例如FloatParameter
或EnumParameter<E>
。A 具有这些类的通用通用超类 ( GenericParameter<T>
),它实现了参数名称及其默认值。子类实现了特定于它们的其他属性,例如FloatParameter
.
此外,我想使用参数的类型,而不管它们的具体类型如何。但我仍然想以它们是GenericParameter<T>
. 为了做到这一点,我创建了一个方法,例如process(Class<? extends GenericParameter<?>> paramType)
.
现在,问题是EnumParameter.class
不能分配给类型变量,Class<? extends GenericParameter<?>>
而FloatParameter.class
可以。
此外,我列出了类的代码以使其更加清晰和可重复:
public class GenericParameter<T> {
protected String name;
protected T defaultValue;
}
public class FloatGenericParameter extends GenericParameter<Float> {
...
}
public class TypedGenericParameter<T> extends GenericParameter<T> {
...
}
Class<? extends GenericParameter<?>> fgpc = FloatGenericParameter.class; // ok
Class<? extends GenericParameter<?>> tgpc = TypedGenericParameter.class; // error: incompatible types: Class<TypedGenericParameter> cannot be converted to Class<? extends GenericParameter<?>>
Class<? extends GenericParameter> tgpc2 = TypedGenericParameter.class; // warning: [rawtypes] found raw type: GenericParameter
最后,当使用非泛型基类时,没有问题:
public class Parameter {
....
}
public class FloatParameter extends Parameter {
...
}
public class TypedParameter<T> extends Parameter {
...
}
Class<? extends Parameter> fpc = FloatParameter.class; // ok
Class<? extends Parameter> tpc = TypedParameter.class; // ok
请问,您有什么建议吗?
我可以process(Class<?> paramType)
作为一种解决方法或进行强制转换,但我想从编译器的静态类型检查中受益。
编辑:
在注册为每种参数类型生成 GUI 组件的工厂时,我想使用强制转换。代码如下所示:
addParameterComponentFactory(EnumParameter.class, new ParameterComponentFactory() { ... })
在这种情况下,编译器会在编译时检查添加的参数类型。此外,代码将更加不言自明。
编辑2:
目前,我正在使用建议的方法来为该方法引入类型参数addParameterComponentFactory
。签名如下所示:
public static <P extends GenericParameter<?>> addParameterComponentFactory(Class<P> clazz, ParameterComponentFactory pcf)
通过这个定义,我可以指定TypedParameter.class
(EnumParameter.class
- 也是一个类型参数)以及获得静态类型检查。