假设以下是类中的方法头:public <t implement =“”comparative =“”<t =“”>&gt; tT最大(T arg1,arg2)</t>

时间:2012-09-28 12:48:35

标签: java generics

我在完成Java的一些功课时遇到了麻烦。我只是无法掌握这些泛型的概念。

问题是:

假设以下是类中的方法标题:

public <T implements Comparable <T>>T greatest(T arg1, T arg2)

找到错误?

我真的不明白该怎么走。

4 个答案:

答案 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);

指定为将thisother进行比较,并返回小于零,零或大于零的数字,具体取决于this是否(分别)更小,相等大于或等于other。 (阅读javadoc!)

所以基本上这就是说T必须是一个compareTo方法的类。显而易见的意图是greatest方法使用 compareTo方法来确定其中两个参数中的哪一个更大......然后返回它。


至于解释 语法,有两种可能的答案:

  • 语法规则是语法规则。你只需遵守它们,否则你的程序将无法编译。

  • JLS设计人员此时必须在通用语法中选择使用implementsextends,或使用一些新的关键字或符号:

    • 添加新的关键字或符号会对语言/工具链的其他部分产生太大影响,因此它们会“出局”。

    • 允许implementsextends是多余的,可能会导致不必要的混淆。

    • 根据implementsextends关键字的其他用法,(IMO)没有令人信服的论据可以说明哪些选项更好。如果他们根据投掷硬币决定我不会感到惊讶......

答案 3 :(得分:0)

纠正拼写错误,编译得很好。

当然,您可以使用Comparable<? super T>稍微提高灵活性。

我曾经写过一个非常相似的实用方法,你可以在这里找到:

http://softsmithy.sourceforge.net/lib/current/docs/api/softsmithy-lib-core/org/softsmithy/lib/util/Comparables.html#max%28T,%20T%29