3

私は次のようなUtilsクラスを持っています:

public static void setComboBoxDefaultWidth(JComboBox cb)
{
    cb.setPrototypeDisplayValue("mmmmmmmmmmmmmmmmmmmmmmmmmm");
}

問題は、これによりコンパイラの警告が発生することです。

JComboBoxはrawタイプです。ジェネリック型JComboBoxへの参照はパラメーター化する必要があります

呼び出し元のメソッドと関数の両方が機能するように(コンパイラエラーなしで)ジェネリックをパラメータ化する方法がわかりません。何らかの理由で一方を解決することはできますが、両方を解決することはできません...

4

4 に答える 4

4

事実JComboBox、Java6ではジェネリックではありませんでしたが、デザインに欠陥があるという理由だけで7でジェネリックになりました(getItemAt()オブジェクトタイプが返されたため、手動でキャストする必要がありました)。

メソッドは次のように宣言されます

public void setPrototypeDisplayValue(E prototypeDisplayValue)

つまり、呼び出すには特定のクラスの特定のインスタンスが必要であり、そのタイプはコンボボックス用に宣言されたものに対応している必要があります。

public void setComboBoxDefaultWidth(JComboBox<String> cb) {
  cb.setPrototypeDisplayValue("mmmmmmmmmmmmmmmmmmmmmmmmmm");
}

Stringメソッドにaを渡すため、強制的に実行するJComboBox必要があります。そのため、にはsが含まれている必要がありますString

上記の解決策は、呼び出したいメソッドがジェネリック型のパラメーターを必要とする場合に実行する必要があることです。それ以外の場合は、(ターゲットの数を指定せずに)指定できず、ワイルドカード?が存在することを使用する必要があります。メソッドがジェネリッククラスの特定のタイプを気にしない場合は、を指定する必要がありますJComboBox。タイプが何であるかを気にせずに汎用タイプ:

public static void setComboBoxDefaultWidth(JComboBox<?> cb) {
    cb.setLightWeightPopupEnabled(true);
}

構文<?>は文字通り未知のタイプを意味し、パラメータは確かJComboBoxに未知のタイプのアイテムです。

于 2012-10-05T01:11:06.703 に答える
2

プロトタイプの表示値は、JComboBoxを入力する値と同じタイプである必要があります。

を指定すると、タイプがわかっている場合にのみJComboBox<E>メソッドを呼び出すことができます。setPrototypeDisplayValue(E prototypeDisplayValue)したがって、ワイルドカード(?)を使用することはできません。現在、できることは次のことだけです。

public static void setComboBoxDefaultWidth(JComboBox<String> cb) {
    cb.setPrototypeDisplayValue("mmmmmmmmmmmmmmmmmmmmmmmmmm");
}

あなたが持つことができる別のオプションはこれでしょう:

public static <E> void setComboBoxDefaultWidth(JComboBox<E> cb, E prototypeValue) {
    cb.setPrototypeDisplayValue(prototypeValue);
}

しかし、それは無意味です。

于 2012-10-05T07:27:26.577 に答える
1

JComboBoxに常に文字列が含まれている場合、構文は次のようになります。

public static void setComboBoxDefaultWidth(JComboBox<String> cb)
{
    cb.setPrototypeDisplayValue("mmmmmmmmmmmmmmmmmmmmmmmmmm");
}
于 2012-10-05T01:10:50.183 に答える
0

あらゆるタイプのジェネリックに対してJComboBoxを保持したい場合はできません。

于 2012-10-07T04:27:12.803 に答える