繁体   English   中英

如何编写比较器以泛化Java中的两种对象?

[英]How to Write a Comparator to Generalize two types of Objects in Java?

我使用以下方法调用返回对象列表。

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

接下来,我使用Comparator对该列表进行排序。 但是List包含两种类型的对象。 某些功能可以使它返回DocumentLinkModelImpl,而某些函数操作则可以返回LinkModelImpl 。因此,当LinkModelImple更改为DocumentLinkModelImpl时,Comparator函数传递了Class Cast异常。这两个对象的父类型也都遵循。

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

让我更清楚我的评论意思。 如果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检入其自己的方法中以清理该代码)

我解决了添加此代码片段的上述麻烦。 但是我需要知道一些更高级的解决方案(如果有的话)。

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

  } else {

  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM