我正在尝试编写一个通用配置加载器,它支持通过使用调用者提供的帮助对象加载到任何目标数据结构中。帮助器用于将加载器与数据结构的任何知识分开,使用预处理成员值、创建子结构和从结构中添加/删除成员的方法。
给定类和变量声明:
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>
对象,然后在其他代码中使用该结构来验证结构类型,然后使用T
参数调用 helper visitor 方法 using helper.configValue(qulnam,stcClass.cast(val),loc.toString())
。
我无法弄清楚为什么编译器无法验证帮助器crtObject
方法的返回是否保证实际上是一个T
对象,因为传递给构造函数的帮助器本身就是一个Helper<T>
.
我看到的唯一选择是将 aClass<T>
作为构造函数参数传入。
任何帮助,将不胜感激。