- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是通配符的新手,对 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/
我是一名优秀的程序员,十分优秀!