请考虑以下两行:
arr = (J[]) new Object[10];
public void add(J obj){
我想在这里指定J实现Comparable,所以我可以编写
while(arr[i] < obj)
如何指定?
编辑:David Wallace的回答看起来是正确的,但我不知道如何在接口和类定义中适当地调整变量的范围。目前,它们是:
public interface OrderedListADT<J> extends Iterable<J> {
public class OrderedVector<J> implements OrderedListADT<J>{
答案 0 :(得分:3)
如果它实现Comparable
,则可以使用其compareTo
方法(给定适当类型的表达式)。如果实例的类型为>
(或其他),则没有语法可以让您使用>=
,<
,<=
或Comparable
运算符。
答案 1 :(得分:2)
如果您在课程级别定义它,那么您可以写下:
public class OrderedVector<J extends Comparable<J>> implements OrderedListADT<J>
如果您希望强制此接口的所有用户插入Comparable
,可以以类似的方式在接口级别定义它,但在班级定义它会很好。
要进一步添加,实现Comparable
的类只有compareTo
方法(返回负数,零或正数,分别小于,等于或大于Java不会使运算符重载,因此不会有任何小于/大于符号的位置。
答案 2 :(得分:0)
我认为我们需要更多细节,因为它不清楚你的情况。但是,假设您有一些类MyClass
(可能是一个抽象类),它不实现Comparable
,但您希望此类的某些子类实现Comparable
。
public void add(MyClass obj) {
...
...
// We execute some logic, and if we get to this point, we can be sure that obj is
// *supposed* to be of a subclass that implements Comparable.
if (((Comparable)obj).compareTo(otherObj) < 0) {
如上所示,您可以使用强制转换将obj
视为Comparable
,然后您可以使用compareTo
方法。 (您不能直接在Java中的<
上使用Comparable
。)如果我们的假设是错误的且obj
确实不是Comparable
,那么ClassCastException
将在运行时抛出。
你也可以事先检查一下:
if (obj instanceof Comparable) {
int comparison = ((Comparable)obj).compareTo(otherObj);
...
} else {
doSomethingUnusualBecauseObjIsntReallyComparable();
}