如何编写一个比较器来概括 Java 中的两种类型的对象?
How to Write a Comparator to Generalize two types of Objects in Java?
我使用以下方法调用 return 对象列表。
final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDocumentLinks();
接下来我使用 Comparator
对这个列表进行排序。但是 List 包含两种类型的对象。一些功能上它 Return DocumentLinkModelImpl 一些功能操作它 return 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());
}*/
});
我需要一些专家的帮助来解决这个问题吗?
注意:
我新添加了上面的排序方法,但在添加之前,该方法对所有对象都执行良好。
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.compare(AbstractEditLinkDialog.java:171)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
at java.util.TimSort.sort(TimSort.java:220)
我解决了添加此代码片段的上述问题。但是我需要知道一些更高级的解决方案,如果知道的话。
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(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
检查自己的方法来清理该代码)
我使用以下方法调用 return 对象列表。
final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDocumentLinks();
接下来我使用 Comparator
对这个列表进行排序。但是 List 包含两种类型的对象。一些功能上它 Return DocumentLinkModelImpl 一些功能操作它 return 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());
}*/
});
我需要一些专家的帮助来解决这个问题吗?
注意: 我新添加了上面的排序方法,但在添加之前,该方法对所有对象都执行良好。
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.compare(AbstractEditLinkDialog.java:171)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
at java.util.TimSort.sort(TimSort.java:220)
我解决了添加此代码片段的上述问题。但是我需要知道一些更高级的解决方案,如果知道的话。
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(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
检查自己的方法来清理该代码)