我对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时使用了通配符,这样我就可以将各种类型的UserVariables全部存储在一个Map中。这里的想法是我的软件用户正在创建变量并给它们命名,软件可以使用变量名称作为键来存储/查找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>
类型。此外,每个UserVariable
的type
在构造每个UserVariable
时被存储。然而,最后一次赋值会给出以下错误:
类型不匹配:无法将Class<capture#1-of?>
转换为Class<T>
也许这是因为Map是UserVariable<?>
的映射?有没有人知道我在这里做错了什么?谢谢你的帮助!
编辑:最终我想做的是在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)时,对象的类型是否总是会丢失?