1

我正在尝试编写一个通用配置加载器,它支持通过使用调用者提供的帮助对象加载到任何目标数据结构中。帮助器用于将加载器与数据结构的任何知识分开,使用预处理成员值、创建子结构和从结构中添加/删除成员的方法。

给定类和变量声明:

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>作为构造函数参数传入。

任何帮助,将不胜感激。

4

1 回答 1

1

您可以声明stctypeas的类型<? extends T>

private final Class<? extends T> stcType;

这将确保stctype能够处理T或任何子类T

为了摆脱编译器错误,您现在可以安全地helper.crtObject().getClass();转换Class<? extends T>为,如下所示:

stcClass = (Class<? extends T>) helper.crtObject().getClass();
于 2013-06-04T04:39:37.943 回答