2017-06-03 57 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