gpt4 book ai didi

java - 具有相同类型的静态嵌套类的泛型类

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:47 26 4
gpt4 key购买 nike

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

给定类和变量声明:

public class ConfigLoader<T extends Object>
...
private final Class<T> stcClass;

和静态嵌套接口(interface):

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.configValue(qulnam,stcClass.cast(val),loc.toString()) 进行论证.

我不明白的是为什么编译器无法验证助手的 crtObject 的返回方法实际上保证是 T对象,因为传递给构造函数的助手本身就是 Helper<T> .

我看到的唯一选择是传递 Class<T>作为构造函数参数。

如有任何帮助,我们将不胜感激。

最佳答案

您可以声明 stctype 的类型如<? extends T> .

private final Class<? extends T> stcType;

这将确保 stctype能够处理TT 的任何子类。

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

stcClass = (Class<? extends T>) helper.crtObject().getClass();

关于java - 具有相同类型的静态嵌套类的泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16909273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com