2014-07-07 131 views
1

,我读了使用通配符与超喜欢这样的:Java的通配符超级

public class MyClass <T extends Comparable<? super T>> { 
    ... 
} 

代替:

public class MyClass <T extends Comparable<T>> { 
    ... 
} 

可以使类的更通用的',但我不明白为什么。

有人可以提供一些具体的例子吗?

+2

可能重复:什么是PECS?](http://stackoverflow.com/questions/2723397/java-g能量是什么 - 佩奇) – ujvl

+0

可能重复[什么是语法?](http://stackoverflow.com/questions/2827585/what-is-super-t-syntax) –

回答

5

这样你就可以为T提供一个类,它本身并不实现Comparable,而是从实现Comparable的类继承而来。

E.g.

class Baseclass implements Comparable<Baseclass> { 
... 
} 

class Inherited extends Baseclass { 
... 
} 

有了这样

public class MyClass <T extends Comparable<? super T>> { 
... 
} 

规范,您可以使用MyClass<Inherited>MyClass<Baseclass>,但

public class MyClass <T extends Comparable<T>> { 
... 
} 

你只能使用MyClass<Baseclass>

[Java的泛型的
+0

我实际上已经尝试过。我创建了一个类Fruit,它实现了Comparable 和2个子类:Apple和Orange。然后,我尝试使用以这种形式写成的方法>(请注意,我没有使用超级关键字),但它仍然将苹果与橙子进行了比较。你有什么想法,为什么?它不应该根据你的答案工作。 – Kami

+0

这是我的另一个问题:https://stackoverflow.com/questions/24629547/java-wildcard-with-super-unexpected-behaviour?noredirect=1#comment38171540_24629547 – Kami

+0

@Kami你会看到,当你的MyClass有getters和setters接受或传递T类型的对象。如果没有超类型,这将无法正常工作。 –