2

私はジェネリッククラスを持っています:

public class Facet<C extends Component>
{
    private final C child;

    public Facet(C child) { this.child = child; }

    public C getChild() { return this.child; }

    public UIComponent getViewComponent() {
        return PrimeFacesComponentFactory.create(facesContext, this.getChild());
    }
}

私は、いくつかのメソッドも持っているコンポーネントファクトリを持っています。そのいくつかは次のようになります。

public static UIComponent create(FacesContext fc, Component component) {
    throw new UnsupportedOperationException("Method not yet implemented for class: " + component.getClass().getName());
}

public static UIRow create(FacesContext fc, Row modelRow) { ... }

public static UIColumn create(FacesContext fc, Column modelColumn) { ... }

注:各ファクトリ メソッドで、2 番目の引数は Component を拡張するオブジェクトであり、返されるものは常に UIComponent のサブクラスです。最初のファクトリ メソッド (例外をスローするメソッド) は、特定のコンポーネント用に記述された特定のファクトリ メソッドがない場合に呼び出される「すべてをキャッチ」することを目的としています。

私がやろうとしていること:コンポーネントファセットの子のタイプに応じて、正しいファクトリメソッドを呼び出す必要があります。何が起こっているかというと、最初のファクトリ メソッドが常に呼び出されます (例: 例外をスローするメソッド)。C の型は実行時に認識され、C は「Component を拡張する特定の型」であるため、これは直感に反します。

デバッグ中、ブレークポイントを に設定し、 Row 型のオブジェクトが返されることがFacet#getViewComponentわかっているときに呼び出します。facet.getChild()したがって、この例では C は Row でした。ファクトリメソッドが呼び出されたときなどを見て驚いた

PrimeFacesComponentFactory.create(facesContext, facet.getChild());

プログラムの実行は「キャッチオール」ファクトリメソッドに流れました! ただし、次のように明示的に facet.getChild() をキャストした場合:

PrimeFacesComponentFactory.create(facesContext, (Row)facet.getChild());

次に、特定のメソッドが呼び出されました。行を行に単純/冗長にキャストするため、奇妙です。

なぜこれが起こっているのかについていくつか読んだことがありますが、それはまだぼんやりしていて、私の心には直感に反しています。いずれにせよ、どうすればこの問題を解決できますか?

4

2 に答える 2

0

次の宣言で

public C getChild() { return this.child; }

public UIComponent getViewComponent() {
    return PrimeFacesComponentFactory.create(facesContext, facet.getChild());
}

facetが意図されていると仮定するとthis、コンパイル時に、型パラメーターについて知られている唯一のことCは、それが拡張することComponentです。したがって、コンパイラは、このメソッド呼び出しを、a を受け入れるように宣言されたメソッドにバインドしComponentます。

public static UIComponent create(FacesContext fc, Component component) {
    throw new UnsupportedOperationException("Method not yet implemented for class: " + component.getClass().getName());
}
于 2013-10-15T18:23:19.393 に答える