我在完成Java的一些功课时遇到了麻烦。我只是无法掌握这些泛型的概念。
问题是:
假设以下是类中的方法标题:
public <T implements Comparable <T>>T greatest(T arg1, T arg2)
找到错误?
我真的不明白该怎么走。
答案 0 :(得分:2)
要进行编译,您必须按以下方式修改:
public <T extends Comparable <T>> T greatest(T arg1, T arg2)
Comparable是一个接口,但在此上下文中,extends用于表示“extends”(对于类)或“implements”(对于接口)。
答案 1 :(得分:1)
错误是您无法在方法签名中使用关键字实现。只在课堂申报中。 这两个编译:
public <T extends Comparable<T>>T greatest(T arg1, T arg2){
return null;
}
public <T extends String>T greatest(T arg1, T arg2){
return null;
}
答案 2 :(得分:1)
我需要解释这个问题,因为我真的不明白该怎么做。
假设您希望我们解释签名的含义......
这可以分为两部分:
public <T ...> T greatest(T arg1, T arg2)
这意味着greatest
是一个方法,它接受两个与某些类型T
兼容的实例,并返回相同类型的实例。 (并且从名称greatest
可以合理地猜测返回的值是两个参数中较大的一个。)
第二部分是这个(假设语法错误已得到纠正):
<T extends Comparable<T>>
这意味着类型T
必须实现Comparable
接口,其中T
作为其类型参数。现在,如果您查看Comparable的javadoc,您将看到它有单一方法:
public int compareTo(T other);
指定为将this
与other
进行比较,并返回小于零,零或大于零的数字,具体取决于this
是否(分别)更小,相等大于或等于other
。 (阅读javadoc!)
所以基本上这就是说T
必须是一个compareTo
方法的类。显而易见的意图是greatest
方法使用 compareTo
方法来确定其中两个参数中的哪一个更大......然后返回它。
至于解释 语法,有两种可能的答案:
语法规则是语法规则。你只需遵守它们,否则你的程序将无法编译。
JLS设计人员此时必须在通用语法中选择使用implements
或extends
,或使用一些新的关键字或符号:
添加新的关键字或符号会对语言/工具链的其他部分产生太大影响,因此它们会“出局”。
允许implements
或extends
是多余的,可能会导致不必要的混淆。
根据implements
或extends
关键字的其他用法,(IMO)没有令人信服的论据可以说明哪些选项更好。如果他们根据投掷硬币决定我不会感到惊讶......
答案 3 :(得分:0)
纠正拼写错误,编译得很好。
当然,您可以使用Comparable<? super T>
稍微提高灵活性。
我曾经写过一个非常相似的实用方法,你可以在这里找到: