2017-06-03 38 views
0

我使用下面的方法調用來返回對象列表。如何編寫比較器來在Java中概括兩種類型的對象?

final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDocumentLinks(); 

接下來我使用了Comparator對這個列表進行排序。但List包含兩種類型的對象。有些功能的工作原理是返回DocumentLinkModelImpl和一些功能操作它返回LinkModelImpl。所以,比較函數傳遞類轉換異常時LinkModelImple變化DocumentLinkModelImpl兩個對象父類型。這也順從。

// Add This method for Sorting Document Link View Same Order. Now The application display same links order 
// in catalogue administration edit drug window 
Collections.sort(documentLinks, 
    (Comparator<? super LinkModelSpi>) new Comparator<DocumentLinkModelImpl>() { 
     @Override 
     public int compare(DocumentLinkModelImpl o1, DocumentLinkModelImpl o2) { 
     return o1.getResource().compareTo(o2.getResource()); 
     } 

     /*@Override 
     public int compare(LinkModelImpl o1,LinkModelImpl o2) { 
     return o1.getResource().compareTo(o2.getResource()); 
     }*/ 

}); 

我需要一些專家的幫助來解決這個問題嗎?

注意: 我新增了上面的sort方法,但是在我添加之前,該方法對所有對象都執行得很好。

final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDocumentLinks(); 

for (final LinkModelSpi documentLinkModelSpi : documentLinks) 
{ 
    //noinspection unchecked 
    ((DtoPresentationModelSpi<?, MDTO>) documentLinkModelSpi).addPropertyChangeListener(this); 
} 

--------------錯誤----------------------

Presentation.impl.LinkModelImpl cannot be cast to Presentation.impl.DocumentLinkModelImpl 
    at Client.catadmin.view.component.AbstractEditLinkDialog$1.compare(AbstractEditLinkDialog.java:171) 
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) 
    at java.util.TimSort.sort(TimSort.java:220) 
+1

您的'DocumentLinkModelImpl'是'LinkModelSpi'的子類型,並且查看您註釋掉的代碼,getResource函數在'LinkModelSpi'上可用 - 那麼爲什麼不製作比較器僅用於'LinkModelSpi'?它可以用於* LinkModelSpi的* any *子類型,包括'DocumentLinkModelImpl'。 –

+1

但先生它通過錯誤。我會將錯誤添加到問題 – uma

回答

3

讓我更清楚我的意思與我的評論。如果DocumentLinkModelImplLinkModelImpl都有方法getResource,那麼超級類型(不能看出它是否是由雙方或超級實現的接口)LinkModelSpi也有方法getResource。所以,那麼你可以這樣寫:

Collections.sort(documentLinks, 
    new Comparator<LinkModelSpi>() { 
     @Override 
     public int compare(LinkModelSpi o1, LinkModelSpi o2) { 
     return o1.getResource().compareTo(o2.getResource()); 
     } 
}); 

即使那不是的話,你可以解決它:

Collections.sort(documentLinks, 
    new Comparator<LinkModelSpi>() { 
     @Override 
     public int compare(LinkModelSpi o1, LinkModelSpi o2) { 
     String resource1, resource2; // String or whatever type the getResource method returns 
     if (o1 instanceof DocumentLinkModelImpl) { 
      resource1 = ((DocumentLinkModelImpl)o1).getResource(); 
     } else if (o1 instanceof LinkModelImpl) { 
      resource1 = ((LinkModelImpl)o1).getResource(); 
     } else { 
      throw new IllegalArgumentException(); 
     } 
     if (o2 instanceof DocumentLinkModelImpl) { 
      resource2 = ((DocumentLinkModelImpl)o2).getResource(); 
     } else if (o2 instanceof LinkModelImpl) { 
      resource2 = ((LinkModelImpl)o2).getResource(); 
     } else { 
      throw new IllegalArgumentException(); 
     } 
     return resource1.compareTo(resource2); 
     } 
}); 

(當然你會因素的instanceof檢查到它自己的方法來清潔代碼)

+0

謝謝先生,事​​情是,LinkModelSpi沒有一個方法getResource ... !!!我認爲它沒有植入相同的超級類。你的第二個解決方案我將嘗試。 – uma

0

我解決了上面添加這段代碼的麻煩。但是我需要知道一些更先進的解決方案,如果知道任何一個。

if (Checks.checkNotNullAndNonEmpty(documentLinks)) { 
    if (this.documentLinksModelSpi.getDocumentLinks().iterator().next() instanceof DocumentLinkModelSpi) { 

    } else { 

    } 
} 
+1

這看起來像是一個很好的強大解決方案。它缺乏什麼?我的意思是,爲什麼以及你如何需要更高級的解決方案沒有給你的東西? –

+0

我想知道,有沒有什麼概括的寫比較函數的方法,可以通過這樣的兩個對象。 (例如:使用java泛型) – uma

相關問題