Java:难以从通配符generic分配到generic

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;

我不熟悉通配符,对Java中的泛型相对缺乏经验,我遇到了分配通配符的问题

我有一个名为
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();