我正在尝试编写一个通用配置加载器,它支持通过使用调用者提供的帮助程序对象加载到任何目标数据结构中。帮助器用于使加载器与数据结构的任何知识分离,使用预处理成员值的方法,创建子结构以及从结构中添加/删除成员。
给出类和变量声明:
public class ConfigLoader<T extends Object>
...
private final Class<T> stcClass;
和静态嵌套接口:
static public interface Helper<T>
{
public Object configValue(String qulfld , String loc);
public Object configValue(String qulfld, T val, String loc);
public Object configValue(String qulfld, String val, String loc);
public Object configValue(String qulfld, Boolean val, String loc);
public Object configValue(String qulfld, Number val, String loc);
public T crtObject();
public void addMember(T tgt, String fld, Object val);
public void rmvMember(T tgt, String fld);
}
和基础构造函数:
private ConfigLoader(JsonParser psr, Helper<T> hlp, DataStruct vld) {
super();
parser =psr;
helper =hlp;
stcClass =helper.crtObject().getClass(); // <== error here
validation =vld;
errors =new ArrayList<Fail>();
}
我在指示的构造函数行中遇到编译器错误:
ConfigLoader.java:79: error: incompatible types
stcClass =helper.crtObject().getClass();
^
required: Class<T>
found: Class<CAP#1>
where T is a type-variable:
T extends Object declared in class ConfigLoader
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object
1 error
目的是在前面创建一个虚拟结构,从中提取Class<T>
对象,然后在其他一些代码中使用它来验证结构类型,然后使用{{调用辅助访问者方法1}}使用T
的参数。
我无法弄清楚为什么编译器无法验证帮助程序的helper.configValue(qulnam,stcClass.cast(val),loc.toString())
方法的返回实际上是crtObject
对象,因为帮助程序传递给构造函数本身就是T
。
我看到的唯一选择是传入Helper<T>
作为构造函数参数。
任何帮助都将不胜感激。
答案 0 :(得分:1)
您可以将stctype
的类型声明为<? extends T>
。
private final Class<? extends T> stcType;
这将确保stctype
能够处理T
或T
的任何子类。
为了摆脱编译器错误,您现在可以安全地将helper.crtObject().getClass();
转换为Class<? extends T>
,如下所示:
stcClass = (Class<? extends T>) helper.crtObject().getClass();