1

次のようなコンパイル エラーが発生します: The method visitParents(Class<C>)in some type is not applied for the arguments(Class<MyClass>)

MyClass は次のようなものです。 public class SortableTable<T>{...}

<C>他の多くのクラスが悪影響を受けるため、SortableTableの型パラメーターを に変更しないことを好みClass<C>ます。

潜在的な解決策は高く評価されます。


アドバイスありがとうございます。ページをコードで埋めずに、できる限り具体的にしようと思います。

「visitParents(SortableTable.class, visitor);」行のエラーの説明:

Component 型のメソッド visitParents(Class"<"C">", IVisitor"<"C,R">") は、引数 (Class"<"SortableTable">", IVisitor"<"Component,無効">")

public class SelectAllFilterPanel extends Panel{private static final Logger log = Logger.getLogger(CorporateActionsPanel.class);

private static final long serialVersionUID = 1L;

public SelectAllFilterPanel(String id, final IModel<Boolean> model){
    super(id);

    add(new AjaxCheckBox("selectAll", model){

        private static final long serialVersionUID = 1L;

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            // TODO - do this properly
            final AjaxRequestTarget requestTarget = target;

            IVisitor<Component, Void> visitor = new IVisitor<Component, Void>(){

                @Override
                public void component(Component component, IVisit visit) {
                    SortableTable<?> table = (SortableTable<?>)component;
                    table.visitChildren(CheckBox.class, new IVisitor<Component, Void>(){

                        @Override
                        public void component(Component component, IVisit visit) {
                            if (!component.getId().equals("selectAll")){
                                CheckBox checkbox = (CheckBox)component;
                                if (model.getObject())
                                    checkbox.setModelObject(true);
                                else 
                                    checkbox.setModelObject(false);
                                requestTarget.add(checkbox);
                            }
                        }
                    });
                    visit.stop();
                }
            };
            visitParents(SortableTable.class, visitor);
            target.add(this);
        }
    });
}}

SortableTable クラス:

public class SortableTable<T> extends DataTable<T, String> {    private HeadersToolbar headerToolbar;   

@SuppressWarnings("unchecked")
public SortableTable(String tableId, SortableTableDataProvider<T> dataProvider, int maxRows) {
    this(tableId, dataProvider.getColumns(), dataProvider, maxRows);
}

@SuppressWarnings("unchecked")
public SortableTable(String tableId, List<IColumnConfig<T, String>> columns, ISortableDataProvider<T, String> dataProvider, int maxRows) {
    super(tableId, new java.util.LinkedList<IColumn<T, String>>(columns), dataProvider, maxRows);               

    addTopToolbar(new NavigationToolbar(this));                     
    addTopToolbar(headerToolbar = new HeadersToolbar(this, dataProvider));

    addBottomToolbar(new NoRecordsToolbar(this));

    setItemReuseStrategy(ReuseIfModelsEqualStrategy.getInstance());
}

public void setHeaderVisible(boolean visible) {
    headerToolbar.setVisibilityAllowed(visible);
}

public boolean isHeaderVisible() {
    return headerToolbar.isVisibilityAllowed();
}

@Override
protected Item<T> newRowItem(String id, int index, IModel<T> model)
{
    return new OddEvenItem<T>(id, index, model);
}}

visitParent の署名は次のとおりです。

    public final <R, C extends MarkupContainer> R visitParents(final Class<C> parentClass,
    final IVisitor<C, R> visitor)
        {
            return visitParents(parentClass, visitor, new AllVisitFilter());
        }
4

3 に答える 3

0

正しく理解できたかどうかわかりません。Class<? extends Object>ただし、どのタイプのパラメータも受け入れることができるものをいつでも使用できます

于 2013-03-14T17:14:30.163 に答える
0

私は解決策を見つけました:

ビジターをインスタンス化するときに、最初のタイプ (コンポーネント) を SortableTable (コンポーネントの子) に変更したため、visitParent メソッドは正常にコンパイルされるようになりました。問題は、最初のパラメーターではなく、visitParents() の 2 番目のパラメーターでした。

                IVisitor<SortableTable, Void> visitor = new IVisitor<SortableTable, Void>(){

                @Override
                public void component(SortableTable component, IVisit visit) {
                    //SortableTable<?> table = (SortableTable<?>)component;
                    component.visitChildren(CheckBox.class, new IVisitor<Component, Void>(){

                        @Override
                        public void component(Component component, IVisit visit) {
                            if (component.getId().equals("selectAll")){
                                CheckBox checkbox = (CheckBox)component;
                                // TODO fix reference to client selection model
                                if (checkbox.getModelObject() && !clientSelectionModel.getObject())
                                    checkbox.setModelObject(false);
                                requestTarget.add(checkbox);
                                visit.stop();
                            }
                        }
                    });
                    visit.stop();
                }
            };
            visitParents(SortableTable.class, visitor);

助けてくれてありがとう。

于 2013-03-18T10:26:08.280 に答える
0

visitParents(Class<C>, Z.IVisitor<C,R>)、 、 C=ComponentおよびR=Void( が であるため)visitorがありIVisitor<Component, Void>ます。しかし、ジェネリックは共変ではないため、 SortableTable.classisの型はClass<SortableTable>代入できません。Class<Component>

の署名を変更できる場合は、次のvisitParentsようにします。

 <R, C extends MarkupContainer>
  R visitParents(Class<? extends C> parentClass, IVisitor<C, R> visitor)

の署名を変更できない場合はvisitParents、実際に があることをコンパイラに納得させる必要がありますClass<Component>

 @SuppressWarnings("unchecked")
 Class<Component> klass = (Class<Component>)(Class<?>)SortableTable.class;
 visitParents1(klass, visitor);

後者のアプローチは技術的に安全ではありませんが、実行時にジェネリック型が消去されるため機能します。

于 2013-03-15T17:08:46.337 に答える