0

私は2つのシンプルなインターフェースを持っています:

public interface HasId<ID extends Serializable> extends Serializable {
  T getId();
}

public interface HasLongId extends HasId<Long> {
  void setId(Long id);
}

今、私がクラスを持っている場合:

public class Person implements HasLongId {
  private Long id;
  private String name;

  public Long getId() {
      return this.id;
  }

  public void setId(Long id) {
      this.id = id;
  }

  public String getName() {
      return this.name;
  }

  public void setName(String name) {
      this.name = name;
  }
}

そして、をインスタンス化してpersonから、それを渡すと、BeanUtils奇妙な動作が発生します。たとえば、BeanUtilsを使用してidを設定すると正常に機能する場合と、Idの「write」メソッドが見つからないために例外が発生する場合があります。リフレクション中に、Serializableのゲッターは検出されますが、Longは検出されず、Serializableのセッターは検出されないようです。これは一貫して行われないため、person.getClass()。getDeclaredMethod( "id")を呼び出すと、常に同じメソッドが返されるとは限らないのではないかと思いますが、それについては間違っている可能性があります。

とにかく、この一貫性のない動作は本当に腹立たしいものです。たとえば、Eclipseでは機能しますがMavenでは機能しないか、長時間機能し、その後、他の場所で無関係な変更を加えると機能しなくなります。

明らかに、私はジェネリックを十分に理解していないので、何が起こっているのかを理解できませんが、誰かが私にそれを説明し、それを回避する方法も説明できますか?

4

2 に答える 2

2

私が使用したApacheCommonsBeanUtilsのバージョンはJava5に対応していなかったため、ジェネリックスやブリッジメソッドなどについては知りませんでした。それが問題だと思います。どのバージョンのBeanUtilsを使用していますか?そしてそれはJava5+に対応していますか?

于 2012-02-29T01:11:42.437 に答える
0

私はこのデザインをあまり気にしません-ゲッターとセッターのためだけのインターフェースは好きではありません。

また、そのインターフェイスでSerializableを拡張することもできません。ここでは、単一責任が最善のアドバイスです。

しかし、私はこのようにそれを試してみます:

public interface Identifiable<T extends Serializable> {
    T getId();
    void setId(T newId);
}

public class Person implements Identifiable<Long> {
    private Long id;
    public Long getId() { return this.id; }
    public void setId(Long id) { this.id = id; }        
}
于 2012-02-29T00:59:54.010 に答える