2013-03-14 158 views
1

我得到一個編譯錯誤呈三角: 在某種類型的方法visitParents(Class<C>)不適用於參數(Class<MyClass>)Java泛型傳入的參數錯誤

MyClass的是一樣的東西:public class SortableTable<T>{...}

我寧願不改SortableTable的類型參數爲<C>,因爲許多其他類將受到負面影響,也不能更改visitParents以除Class<C>之外的任何參數作爲參數。

任何潛在的解決方案將不勝感激。


感謝您的建議。 我會盡量具體,因爲我可以沒有填寫代碼的頁面。上線

錯誤描述 「visitParents(SortableTable.class,訪客);」:

方法visitParents(類 「< 」C「>」,IVisitor 「< 」C,R「>」)在型組件是不適用的參數(類 「< 」SortableTable「>」,IVisitor 「< 」組件,空隙「>」)

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()); 
     } 
+0

你需要更具體。發佈實際的錯誤不是「類似」。告訴我們關於這個階段的問題,你是否正在調用'T'的子類,'T'的超類? – 2013-03-14 16:49:47

+0

告訴我們你是如何調用代碼的。 – pcalcao 2013-03-14 16:49:47

+0

*我不希望更改MyClass的類型參數,因爲許多其他類會受到負面影響*我們不確定,因爲您沒有發現真正的問題。 – 2013-03-14 16:56:08

回答

0

我不知道我是否正確理解。但是,你可以隨時使用Class<? extends Object>它可以接受任何類型的參數

+0

這對我來說不是一個可行的解決方案。對不起,我最初的問題並不清楚。我現在已經包含了更多細節。問題是我的方法的第一個參數應該是類,但我傳遞給它的類被視爲Class 。我想我錯過了一些非常明顯的東西,但不知道是什麼。 – Ramin 2013-03-15 14:14:05

0

你有visitParents(Class<C>, Z.IVisitor<C,R>),與C=ComponentR=Void(因爲visitorIVisitor<Component, Void>)。 但是SortableTable.class的類型是Class<SortableTable>,由於generics are not covariant不能指定爲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); 

雖然後面的方法在技術上不安全,但它的工作原理是因爲在運行時generic types are erased

0

我找到了解決方案:

當實例化訪問者我改變第一類型(組分)到SortableTable(這是組件的子組件),因此該方法visitParent現在編譯罰款。這個問題是visitParents()中的第二個參數,而不是第一個參數。

   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); 

感謝您的幫助球員。