2

ユーザー インターフェイスのコードをいくつか作成しています。このコードには、次のような汎用インターフェイスがあります。

public interface DataValue<T>
{
  public String getName();

  public T getValue();

  public String getDescription();

}

現在、このインターフェイスはコード全体の多くの列挙型によって実装されており、DataValue インターフェイスで表すことができるインターフェイスの値のホバー イベント コントローラーで使用されます。このコントローラーにいくつかの警告があることに気付いたので、それらを削除する方法を見つけようとして失敗しました。コントローラ クラスは次のようになります。

public class HintController implements ItemHoverHandler
{

private final Class<? extends Enum> theEnumClass;

public HintController(Class<? extends Enum> enumClass)
{
    theEnumClass = enumClass;
}

@Override
@SuppressWarnings("unchecked")
public void onItemHover(ItemHoverEvent event)
{
  FormItem formItem = event.getItem();
  Enum<?> enumValue =
     Enum.valueOf(theEnumClass, (String)formItem.getValue());
  String prompt = (enumValue instanceof DataValue)
     ? getPromptForDataValue((DataValue)enumValue)
     : null;
  formItem.setPrompt(prompt);
}


 private String getPromptForDataValue(DataValue<?> dataValue)
 {
  return "<b>" + dataValue.getName() + "</b><br /><br />"
     + dataValue.getDescription();
 }
}

もちろん、この実装には、修正できない rawType 警告がいくつかあります。フィールドを ? でパラメータ化すると、? ワイルドカードを使用すると、境界例外が表示されます。私の最後の「試み」は、フィールドのタイプと構築パラメーターを次のように変更しようとしたときでした。

 public class HintController implements ItemHoverHandler
 {

   private final Enum<? extends DataValue<?>> theEnumClass;

   public HintController(Enum<? extends DataValue<?>>enumClass)
   {
    theEnumClass = enumClass;
   }


    @Override
    public void onItemHover(ItemHoverEvent event)
    {
     FormItem formItem = event.getItem();
     Enum<? extends DataValue<?>>enumValue =
        Enum.valueOf(theEnumClass.getDeclaringClass(),formItem.getValue().toString());
     String prompt = (enumValue instanceof DataValue)
        ? getPromptForDataValue((DataValue<?>)enumValue)
       : null;
     formItem.setPrompt(prompt);
    }


    private String getPromptForDataValue(DataValue<?> dataValue)
    {
      return "<b>" + dataValue.getName() + "</b><br /><br />"
        + dataValue.getDescription();
    }
 }

しかしもちろん、そのタイプの参照を実際に送信する方法が見つからなかったため、失敗しました。これらは列挙型であり、インスタンス化できないためです。これを行う適切な方法があるはずだと思いますが、誰かが助けてくれればありがたいです。ありがとう

4

3 に答える 3

1

HintController:に実際のタイプのパラメーターを設定することで、警告を消すことができます。

public class HintController<E extends Enum<E>> implements ItemHoverHandler {

    private final Class<E> theEnumClass;

    public HintController(Class<E> enumClass) {
        theEnumClass = enumClass;
    }

    @Override
    public void onItemHover(ItemHoverEvent event) {
        FormItem formItem = event.getItem();
        E enumValue = Enum.valueOf(theEnumClass, (String) formItem.getValue());
        String prompt = (enumValue instanceof DataValue) ? getPromptForDataValue((DataValue<?>) enumValue) : null;
        formItem.setPrompt(prompt);
    }

    private String getPromptForDataValue(DataValue<?> dataValue) {
        return "<b>" + dataValue.getName() + "</b><br /><br />" + dataValue.getDescription();
    }

}

それを使用する他のクラスへの影響を考えると、それがもっともらしいかどうかは言えません。私はそれがそうなるだろうと想像します-それを作成するところならどこでも、enumClassコンストラクターパラメーターのタイプについてすでにいくつかのアイデアを持っています。それは単にに伝播することができますHintController。他の方法でそれを使用する場所は、常にそれをと呼ぶことができますHintController<?>

于 2013-01-15T20:15:22.803 に答える
1

HintController一見すると、ジェネリックにすることで問題を解決できるように見えます。

public class HintController<T extends Enum<T>> implements ItemHoverHandler {

    private final T theEnumClass;

    //and so on...

ただし、theEnumClassenum のインスタンスを指すだけなので、おそらく間違った名前であることに注意してくださいTClass<T>おそらく代わりに使用したいと思うでしょう。これにより、 のようなリフレクション メソッドを呼び出すことができますgetEnumConstants()

于 2013-01-15T20:13:56.593 に答える
0

これがインターフェースであるべきかどうかはわかりません。DataValue は実際にはclassである必要があるようです。

public class DataValue< T extends Enum >
{
    public String getName() { ... }
    public String getValue() { ... } 
    public String getDescription() { ... }
}

その場合は、ホバー イベントに DataValue を配置するだけで、そこから直接情報を取得できます。

于 2013-01-15T20:13:44.363 に答える