Java:难以从通配符generic分配到generic
我不熟悉通配符,对Java中的泛型相对缺乏经验,我遇到了分配通配符的问题 我有一个名为Java:难以从通配符generic分配到generic,java,generics,collections,wildcard,Java,Generics,Collections,Wildcard,我不熟悉通配符,对Java中的泛型相对缺乏经验,我遇到了分配通配符的问题 我有一个名为UserVariable的自定义泛型类。每个UserVariable都知道关于它自己的两件事:它的类型和它的值,这两件事在构造它时都是需要的。裸骨定义如下所示: class UserVariable<T extends Comparable<T>> implements Comparable<UserVariable<T>> { private T value;
UserVariable
的自定义泛型类。每个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;
}
}
也就是说,我使用变量名和要比较的值构造了一个SimpleComparison
对象。稍后,我在该对象上调用evaluate
,传入当前变量值的映射,它将变量的当前值(取自映射)与构造时传入的比较值进行比较,并返回结果
但是,我不确定对
compareTo
的调用是否有效,因为lhs
将希望类型为Class
,而rhs
将类型为Class
。有没有办法按照我的意愿去做?或者,当我将对象放入通配符对象的容器(本例中为映射)时,对象的类型是否总是会丢失?问题在于,映射包含具有不同类型参数的值(您可以存储类,类等)当您从映射中获取值时,您不知道该值具有什么类型参数,并且编译器会引发错误,因为您不能使用与t
不同的类型参数对Class
值进行强制转换(但您可以通过(Class)theVars.getVariable(variableName).getType()显式强制转换为Class
)
编译器警告不安全强制转换)。编译器严格检查泛型。因此,只要您维护与同一类型的其他安装相关的每个泛型实例化,一切都很好:
MyGeneric<String> s1=...
MyOtherGeneric<String> o1=...
s1.doSomething(o1);
。。。并在您所称的任何位置添加适当的类型参数替换:
this.myVarType=theVars.<T> getVariable(variableName).getType();
this.myVarType=theVars。getVariable(variableName).getType();
谢谢您的回复。我在原来的帖子中添加了一个后续问题。你知道是否有可能做到我想做的事情吗?例如,当你从映射中获取类型参数时,你不知道它是什么,但对象本身知道它自己的类型,因为它在构造时将其存储为私有变量,对吗?有可能利用这些信息吗?
public int evaluate(VarsMap theVars)
{
UserVariable<T> lhs = theVars.getVariable(variableName);
UserVariable<T> rhs = new UserVariable<T>(comparisonValue, myVarType);
return lhs.compareTo(rhs);
}
MyGeneric<String> s1=...
MyOtherGeneric<String> o1=...
s1.doSomething(o1);
MyGeneric<String> s1=...
MyOtherGeneric<Double> o1=...
s1.doSomething(o1); // Error
public <T extends Comparable<T>> UserVariable<T> getVariable(String name)
{
return (UserVariable<T>)this.userVars.get(name);
}
this.myVarType=theVars.<T> getVariable(variableName).getType();