What is <? super T> syntax?
我正在阅读此答案,这使我消除了一些疑问,但我不明白这一行中的一件事:
T extends Comparable< ? super T>
该帖子答复中的每个人都解释说T实现了Comparable<T or T's superclass>
;
但是有书面的扩展,所以T是Comparable的子接口,而不是子类,那么为什么所有的回复都将实现作为动词?
我唯一的猜测是,它们都暗示T是一个对象,其静态类型是Comparable的子接口,而动态类型实际上是可比较的实现类,是吗?
java大神给出的解决方案
事实是,T
可以是实现Comparable
的类,也可以是Comparable
的子接口。通用约束语法中使用的单词extends
与类继承子句中的单词extends
含义不同。
下面的代码演示了两种情况:
interface Foo {}
interface Bar extends Foo {}
class Baz implements Foo {}
public static <T extends Foo> void f(T t) {
}
Bar bar = new Bar() {};
f(bar); // compiles!
Baz baz = new Baz();
f(baz); // compiles!
但是,T
作为实现Comparable
的类比作为Comparable
的子接口的可能性要大得多。 JDK中Comparable
的唯一子接口是:
ChronoLocalDate, ChronoLocalDateTime<D>, Chronology, ChronoZonedDateTime<D>, Delayed, Name, Path, RunnableScheduledFuture<V>, ScheduledFuture<V>
与实现Comparable
的类(例如Instant
和String
)相比,您不会经常使用它们。
因此,人们之所以说“ T
是实现Comparable
的类”,仅仅是因为这是更可能的情况。
有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Tomcat找不到直接放置在classes文件夹下的类 - java我有以下JSP:<%@ page import="foo.*" %> <html> <body> The page count is: <%=Counter.getCount()%> </body> </html> 我在包Counter中有一个foo类,该类存储在: …
如何修改休眠的SQL查询? - java我有点好奇,有没有办法修改hibernate的核心,以便我可以自定义生成的SQL query。例如,在生成的查询中添加功能以使用connect by prior(oracle)或我要自定义的任何其他子句。 java大神给出的解决方案 起初,这样的问题总是在我心中敲响警钟。你被警告了...AFAIK,hibernate使用所谓的dialects进行特定的优化。…
用Java构建大批量数据处理工具 - javaClosed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。 3年前关闭。 Improve this question 我正在尝试使用Java构建ETL工具。 ETL工具用于对大量数据(关系型和其他类型)进行批量读取,…
用Java封装对象? - javaprivate中的Java提供类级别的封装。可以封装一个对象吗?还是这样做徒劳?例如,如果我们将一个类定义为 public class Person { private String ssn; private ArrayList<Person> friends = new ArrayList<Person>(); public voi…