如何编写一个比较器来概括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。。。!!!我认为这不是同一个超级类。我将尝试你的第二个解决方案。