Java 获取不同类对象的泛型方法
我有3个类(TechSpec、packages和features)对象,它们共享相同的字段。字段很大,我希望将类对象传递到一个方法中,该方法使用泛型对象来设置对象字段,而不是重复设置每个字段的字段3次(最终看起来像是重复的) 我尝试将类对象作为泛型传递,但是我无法访问其成员。这就是我试过的Java 获取不同类对象的泛型方法,java,generics,Java,Generics,我有3个类(TechSpec、packages和features)对象,它们共享相同的字段。字段很大,我希望将类对象传递到一个方法中,该方法使用泛型对象来设置对象字段,而不是重复设置每个字段的字段3次(最终看起来像是重复的) 我尝试将类对象作为泛型传递,但是我无法访问其成员。这就是我试过的 Packages packagesFeatures = new Packages(); TechSpecs techSpecsFeature = new TechSpecs(); packages
Packages packagesFeatures = new Packages();
TechSpecs techSpecsFeature = new TechSpecs();
packagesFeatures = addFeatures(Packages.class, packagesFeatures, vehFeatures);
techSpecsFeature = addFeatures(TechSpecs.class, techSpecsFeature, vehFeatures);
然后
所有这些字段都需要在所有3个类的类对象中设置
编辑2
VehicleFeature类是一个独立类
@JsonInclude(JsonInclude.Include.NON_NULL)
public class VehicleFeature {
private String section;
private String subSection;
private String featureName;
private String subSectionId;
private String sectionName;
private String subSectionName;
如果是我,我会将您的
addFeatures(…)
方法简化为:
private <T> T addFeatures(Class<T> clazz, BaseFeatures theseFeatures) {
T obj = null;
try {
obj = clazz.getDeclaredConstructor(BaseFeatures.class).newInstance(theseFeatures);
} catch (ReflectiveOperationException roe) {
roe.printStackTrace();
}
return obj;
}
你可以在这里:
“它们都共享相同的字段”-您是否考虑过创建一个Java
接口
,以使编译器可以使用这些信息?如果您可以找到大字段的名称,那么您可能会遇到一个新类,包和Techspec可以扩展哪些类?在下一步中,您可以考虑优先组合而不是继承3个类中的每个类都扩展了抽象类baseFeatures。例如:公共类TechSpecs扩展了BaseFeatures{·…字段很大…-你说的“大”到底是什么意思?确切地说,这3个类中的每一个都扩展了抽象类BaseFeatures。。。“-想和大家分享一下吗?我添加了一个editP.S。当我做的时候,我继续可选的addFeatures(…)
而不是潜在地返回null
。让我来处理这个问题,稍后再回复。感谢车辆功能不属于BaseFeatures类。我得到错误:车辆功能与BaseFeatures不兼容。你有没有发现这个错误?请分享一个你如何称呼它的片段?查看Implementation链接我还有更多的工作要做。我会晚些时候回来的。对不起
public class TechSpecs extends BaseFeatures {
private String techSpecs;
public void setTechSpecs(String techSpecs) {
this.techSpecs = techSpecs;
}
public String getTechSpecs(){
return techSpecs;
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public class VehicleFeature {
private String section;
private String subSection;
private String featureName;
private String subSectionId;
private String sectionName;
private String subSectionName;
private <T> T addFeatures(Class<T> clazz, BaseFeatures theseFeatures) {
T obj = null;
try {
obj = clazz.getDeclaredConstructor(BaseFeatures.class).newInstance(theseFeatures);
} catch (ReflectiveOperationException roe) {
roe.printStackTrace();
}
return obj;
}
public abstract class BaseFeatures{
protected String featureId;
protected String featureKey;
protected String featureCode;
/*...*/
protected BaseFeatures(String featureId, String featureKey, String featureCode){
this.featureId = featureId;
this.featureKey = featureKey;
this.featureCode = featureCode;
}
protected BaseFeatures(BaseFeatures features){
this.featureId = features.featureId ;
this.featureKey = features.featureKey;
this.featureCode = features.featureCode;
}
/*...*/
}
public class BigAssFields {
/* ... */
static public void main(String ... args){
BigAssFields bLike = new BigAssFields();
VehicleFeature vehFeatures = new VehicleFeature("what", "the actual", "Feature");
TechSpecs bigTechSpecs = bLike.addFeatures(TechSpecs.class, vehFeatures);
}
/* ... */
}