私はワイルドカードを使い始めていて、Javaのジェネリックスでは経験がほとんどなく、問題を割り振っています。Java:ワイルドカードのジェネリックからジェネリックに割り当てるのが難しい
私はUserVariable<T>
というカスタムジェネリッククラスを持っています。各UserVariableは、その型とその値の2つのことを認識しています。どちらも、構築時に予期されています。必要最小限の定義は次のようになります。
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のコレクションを持っています。私はマップを定義する際にワイルドカードを使用して、さまざまなタイプのUserVariableをすべて1つのマップに格納できるようにしました。ここでの考え方は、私のソフトウェアのユーザーは、変数を作成し、それらに名前を与えているということで、ソフトウェアを格納することができます/キーとして変数名を使用してマップ内の変数を調べる:
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);
}
}
その後、私が持っていますこの変数の1つを取り出してその型を格納しようとするクラスです。私はClass<T>
として定義され、UserVariable<T>
のgetType()
方法はClass<T>
を返す必要があります...
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
を非常に最後の割り当てとのトラブルを抱えています。また、各UserVariable
のtype
は、各UserVariable
が構築された時点で格納される。
型の不一致:しかし、最後の割り当ては次のエラーを与える地図UserVariable<?>
のマップであるため、Class<capture#1-of ?>
からClass<T>
に変換することはできませんおそらくこれはありますか?誰も私がここで間違っていることを知っていますか?ご協力いただきありがとうございます!
編集:
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
呼ばSimpleComparison
のメソッドを持っています。後でそのオブジェクトのevaluate
を呼び出し、現在の変数値のマップを渡し、(Mapから取得した)変数の現在の値と、構築時に渡された比較値を比較し、結果を返します。
しかし、私はlhs
がrhs
がタイプClass<T>
のものであろうしながら、タイプClass<?>
であることになるでしょうのでcompareTo
への呼び出しが動作するか分かりません。これを私が意図している方法でやる方法はありますか?あるいは、ワイルドカードオブジェクトのコンテナ(この場合はMap)にオブジェクトをドロップすると、そのオブジェクトのタイプは常に失われますか?
感謝を。元の投稿にフォローアップの質問を追加しました。私がしようとしていることが可能かどうか知っていますか? – skrilmps
たとえば、型パラメータがマップから取得されたときにその型パラメータが何であるかを知ることはできませんが、オブジェクト自体は、構築時にプライベート変数として格納されているため、独自の型を認識します。その情報を利用することは可能ですか? – skrilmps
@skrilmps、更新) –