gpt4 book ai didi

Java:难以从通配符泛型分配给泛型

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:10 24 4
gpt4 key购买 nike

我是通配符的新手,对 Java 中的泛型相对缺乏经验,我在分配通配符时遇到了问题。

我有一个名为 UserVariable<T> 的自定义通用类.每个 UserVariable 都知道关于它自己的两件事:它的类型和它的值,这两者都是在构造它时所期望的。准系统定义如下所示:

class UserVariable<T extends Comparable<T>> implements Comparable<UserVariable<T>>
{

private T value;
private final transient Class<T> type;

public UserVariable(T value, Class<T> type)
{
this.value = value;
this.type = type;
}

public T getValue()
{
return value;
}

public Class<T> getType()
{
return type;
}

}

我将这些 UserVariables 的集合存储在一个 Map 中。我在定义 Map 时使用了通配符,这样我就可以在一个 Map 中存储各种类型的 UserVariables。这里的想法是,我的软件的用户正在创建变量并为它们命名,软件可以使用变量名作为键在 Map 中存储/查找变量:

class VarsMap {

private ObservableMap<String, UserVariable<?>> userVars = FXCollections.observableHashMap();

public void setVariable(String name, UserVariable<?> variable)
{
userVars.put(name, variable);
}

public UserVariable<?> getVariable(String name)
{
return userVars.get(name);
}

}

稍后,我有一个类试图检索其中一个变量并存储其类型。我在完成最后一项任务时遇到了问题...

class SimpleComparison<T extends Comparable<T>> {

private StringProperty variableName = new SimpleStringProperty("");
private T comparisonValue;
private transient Class<T> myVarType;

public SimpleComparison(String variableName, T value, VarsMap theVars)
{
this.myVarType = theVars.getVariable(variableName).getType(); //error here
}

}

this.myVarType被定义为 Class<T>UserVariable<T>getType()方法应返回 Class<T> .此外,type对于每个 UserVariable存储在每个时间 UserVariable被构造。但是,最后一次分配给出了以下错误:

类型不匹配:无法从 Class<capture#1-of ?> 转换至 Class<T>

也许这是因为 map 是 UserVariable<?> 的 map ?有谁知道我在这里做错了什么?感谢您的帮助!

编辑:最终我想做的是在 SimpleComparison 中有一个方法称为 evaluate这样做:

public int evaluate(VarsMap theVars)
{
UserVariable<T> lhs = theVars.getVariable(variableName);
UserVariable<T> rhs = new UserVariable<T>(comparisonValue, myVarType);

return lhs.compareTo(rhs);
}

也就是说,我构造了一个SimpleComparison使用变量名称和要比较的值的对象。后来我打电话evaluate在该对象上,传入当前变量值的 Map,并将变量的当前值(取自 Map)与构造时传入的比较值进行比较,并返回结果。

但是,我不确定对 compareTo 的调用会工作因为lhs将希望成为 Class<?> 类型同时 rhs将是 Class<T> 类型.有没有办法按照我打算的方式做到这一点?或者,当我将对象放入通配符对象容器(本例中为 Map)时,对象的类型是否总是会丢失?

最佳答案

问题是您的 map 包含具有不同类型参数的值(您可以存储 Class<Integer>Class<String> 等),当您从 map 中获取值时,您不知道该值具有什么类型参数,并且编译器引发错误,因为您无法转换为 Class<T>类型参数不同于 T 的值(但您可以通过 Class<T> 显式转换为 (Class<T>) theVars.getVariable(variableName).getType(),编译器警告不安全转换)。

关于Java:难以从通配符泛型分配给泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40007564/

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