如何编写一个比较器来概括Java中的两种类型的对象?

如何编写一个比较器来概括Java中的两种类型的对象?,java,generics,comparator,Java,Generics,Comparator,我使用下面的方法调用返回对象列表 final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDocumentLinks(); 我需要一些专家的帮助来解决这件事 注: 我新添加了上面的sort方法,但在添加它之前,该方法对所有对象都执行得很好 final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDo

我使用下面的方法调用返回对象列表

final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDocumentLinks(); 
我需要一些专家的帮助来解决这件事

注: 我新添加了上面的sort方法,但在添加它之前,该方法对所有对象都执行得很好

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

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

我解决了上面添加此代码片段的问题。但我需要知道一些更高级的解决方案,如果知道的话

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

  } else {

  }
}

我解决了上面添加此代码片段的问题。但我需要知道一些更高级的解决方案,如果知道的话

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

  } else {

  }
}

让我更清楚我的评论是什么意思。如果
DocumentLinkModelImpl
LinkModelImpl
都有一个方法
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(文档链接、,
新比较器(){
@凌驾
公共整数比较(LinkModelSpi o1、LinkModelSpi o2){
返回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);
      }
});
Collections.sort(文档链接、,
新比较器(){
@凌驾
公共整数比较(LinkModelSpi o1、LinkModelSpi o2){
String resource1,resource2;//String或getResource方法返回的任何类型
if(o1 DocumentLinkModelImpl实例){
resource1=((DocumentLinkModelImpl)o1.getResource();
}else if(链接模型impl的o1实例){
resource1=((LinkModelImpl)o1.getResource();
}否则{
抛出新的IllegalArgumentException();
}
if(o2实例of DocumentLinkModelImpl){
resource2=((DocumentLinkModelImpl)o2).getResource();
}else if(o2 instanceof LinkModelImpl){
resource2=((LinkModelImpl)o2).getResource();
}否则{
抛出新的IllegalArgumentException();
}
返回resource1.compareTo(resource2);
}
});

(当然,您会将检查的
实例考虑到它自己的清理代码的方法中)

让我更清楚我的评论的意思。如果
DocumentLinkModelImpl
LinkModelImpl
都有一个方法
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(文档链接、,
新比较器(){
@凌驾
公共整数比较(LinkModelSpi o1、LinkModelSpi o2){
返回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);
      }
});
Collections.sort(文档链接、,
新比较器(){
@凌驾
公共整数比较(LinkModelSpi o1、LinkModelSpi o2){
String resource1,resource2;//String或getResource方法返回的任何类型
if(o1 DocumentLinkModelImpl实例){
resource1=((DocumentLinkModelImpl)o1.getResource();
}else if(链接模型impl的o1实例){
resource1=((LinkModelImpl)o1.getResource();
}否则{
抛出新的IllegalArgumentException();
}
if(o2实例of DocumentLinkModelImpl){
resource2=((DocumentLinkModelImpl)o2).getResource();
}else if(o2 instanceof LinkModelImpl){
resource2=((LinkModelImpl)o2).getResource();
}否则{
抛出新的IllegalArgumentException();
}
返回resource1.compareTo(resource2);
}
});

(当然,您会将检查的
实例考虑到它自己的方法中以清除该代码)

您的
文档LinkModelImpl
LinkModelSpi
的一个子类型,并查看您注释掉的代码,
getResource
函数在
LinkModelSpi
上可用——那么为什么不只为
LinkModelSpi
创建一个比较器呢?它将适用于
LinkModelSpi
的任何子类型,包括
DocumentLinkModelImpl
。但是它通过了错误。我将向问题添加错误您的
DocumentLinkModelImpl
LinkModelSpi
的一个子类型,查看您注释掉的代码,
getResource
函数在
LinkModelSpi
上可用,那么您为什么不只为
LinkModelSpi
创建一个比较器呢?它将适用于
LinkModelSpi
的任何子类型,包括
DocumentLinkModelImpl
。但是它通过了错误。我会给问题加上一个错误。对我来说,这看起来是一个好的、健壮的解决方案。它缺少什么?我的意思是,为什么以及如何需要这个解决方案没有提供的更高级的东西?我想知道,有没有通用的方法来编写比较器函数,可以是pass,两个这样的对象。(例如:使用java泛型)在我看来,这是一个好的、健壮的解决方案。它缺少什么?我的意思是,为什么以及如何需要这个解决方案没有提供的更高级的东西?我想知道,有没有通用的方法来编写比较器函数,可以是pass,两个这样的对象。(例如:使用java泛型)谢谢您,先生,问题是,LinkModelSpi没有方法getResource。。。!!!我认为它不是同一个超级类。我将尝试您的第二个解决方案。谢谢您,先生,问题是,LinkModelSpi没有方法getResource。。。!!!我认为这不是同一个超级类。我将尝试你的第二个解决方案。