7

拜托,我想知道写作和写作的区别

public class Something<T extends Comparable<T>> {// }

public class Something<T extends Comparable> {// }

以及这将如何影响代码

4

2 回答 2

4

不同之处在于,在第一种情况下,类型参数T必须与自身具有可比性,而在第二种情况下T,可以与任何事物进行比较。通常,当一个类具有可比性时,它无论如何C都被声明为实现。Comparable<C>不过,这里有一个示例,说明第一个不起作用但第二个会起作用:

class C1<T extends Comparable<T>> {  // first case
}

class C2<T extends Comparable> {  // second case
}

class A {  // some super class
}

class B extends A implements Comparable<A> {  // comparable to super class
    @Override
    public int compareTo(A o) {
        return 0;
    }
}

现在:

new C1<B>();  // error
new C2<B>();  // works

一般来说,你不应该使用第二种方法。尽可能远离原始类型。另请注意,第二种方法的更好选择是

public class Something<T extends Comparable<? super T>> { /*...*/ }

使用它C1也可以new C1<B>()编译上面的行。

于 2013-09-22T14:29:57.117 回答
0

这就是区别所在。

如果您不在接口中使用泛型,则必须强制转换。签名包括Object

package generics;

/**
 * NonGenericComparable description here
 * @author Michael
 * @link http://stackoverflow.com/questions/18944582/difference-in-java-generics?noredirect=1#comment27975341_18944582
 * @since 9/22/13 10:55 AM
 */
public class NonGenericComparable implements Comparable {
    private final int x;

    public NonGenericComparable(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }

    @Override
    public int compareTo(Object o) {
        NonGenericComparable other = (NonGenericComparable) o;
        if (this.x < other.x) return -1;
        else if (this.x > other.x) return +1;
        else return 0;
    }
}

如果您使用泛型,您将获得更高的类型安全性。不需要铸造。

package generics;

/**
 * GenericComparable uses generics for Comparable
 * @author Michael
 * @link http://stackoverflow.com/questions/18944582/difference-in-java-generics?noredirect=1#comment27975341_18944582
 * @since 9/22/13 10:53 AM
 */
public class GenericComparable implements Comparable<GenericComparable> {
    private final int x;

    public GenericComparable(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }

    @Override
    public int compareTo(GenericComparable other) {
        if (this.x < other.x) return -1;
        else if (this.x > other.x) return +1;
        else return 0;
    }
}
于 2013-09-22T14:59:52.577 回答