Java 假设以下是类中的方法头:public<;T实施可比<;T>&燃气轮机;tT最大值(T arg1,arg2)

Java 假设以下是类中的方法头:public<;T实施可比<;T>&燃气轮机;tT最大值(T arg1,arg2),java,generics,Java,Generics,我的一些Java作业遇到了问题。我就是不能理解这些泛型的概念 问题是: 假设以下是类中的方法头: public <T implements Comparable <T>>T greatest(T arg1, T arg2) public T最大值(T arg1,T arg2) 找到错误了吗 我真的不知道该怎么走 要编译这些内容,必须按以下方式进行修改: public <T extends Comparable <T>> T greatest(T

我的一些Java作业遇到了问题。我就是不能理解这些泛型的概念

问题是:

假设以下是类中的方法头:

public <T implements Comparable <T>>T greatest(T arg1, T arg2)
public T最大值(T arg1,T arg2)
找到错误了吗


我真的不知道该怎么走

要编译这些内容,必须按以下方式进行修改:

public <T extends Comparable <T>> T greatest(T arg1, T arg2)
public T最大值(T arg1,T arg2)

Comparable是一个接口,但在此上下文中,extends用于表示“extends”(用于类)或“implements”(用于接口)。

要使该内容编译,必须按以下方式修改:

public <T extends Comparable <T>> T greatest(T arg1, T arg2)
public T最大值(T arg1,T arg2)

Comparable是一个接口,但在此上下文中,extends用于表示“extends”(用于类)或“implements”(用于接口)。

更正了输入错误后,它可以很好地编译


当然,您可以使用
compariable使其稍微灵活一些,并纠正拼写错误,它编译得很好


当然,您可以使用
Comparable稍微灵活一点。错误在于您不能在方法签名中使用关键字实现。仅在类内声明。
这两种方法都可以编译:

 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;
    }
public T最大值(T arg1,T arg2){
返回null;
}
公共T最大(T arg1,T arg2){
返回null;
}

错误在于不能在方法签名中使用关键字implements。仅在类内声明。 这两种方法都可以编译:

 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;
    }
public T最大值(T arg1,T arg2){
返回null;
}
公共T最大(T arg1,T arg2){
返回null;
}
我非常需要一个解释,因为我真的不知道怎么去

假设你想让我们解释签名的意思

这可以分为两部分:

public <T ...> T greatest(T arg1, T arg2)
这意味着类型
T
必须实现
Comparable
接口,并将
T
作为其类型参数。现在,如果您查看javadocs中的Comparable,您将看到它只有一个方法:

public int compareTo(T other);
指定为将
其他
进行比较,并根据
是否(分别)小于、等于或大于
其他
返回小于零、零或大于零的数字。(阅读javadoc!)

所以基本上这是说
T
必须是一个带有
compareTo
方法的类。明显的意图是
magest
方法将使用
compareTo
方法来找出它的两个参数中哪个更大。。。然后把它还给我


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

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

  • JLS设计者必须在通用语法中选择使用
    实现
    扩展
    ,或者使用一些新的关键字或符号:

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

    • 允许
      实现
      扩展
      是多余的,可能会导致不必要的混淆

    • 根据
      implements
      extends
      关键字的其他用法,对于这些选择中的哪一个更好,(IMO)没有令人信服的论据。如果他们是根据掷硬币决定的,我不会感到惊讶

我非常需要一个解释,因为我真的不知道怎么去

假设你想让我们解释签名的意思

这可以分为两部分:

public <T ...> T greatest(T arg1, T arg2)
这意味着类型
T
必须实现
Comparable
接口,并将
T
作为其类型参数。现在,如果您查看javadocs中的Comparable,您将看到它只有一个方法:

public int compareTo(T other);
指定为将
其他
进行比较,并根据
是否(分别)小于、等于或大于
其他
返回小于零、零或大于零的数字。(阅读javadoc!)

所以基本上这是说
T
必须是一个带有
compareTo
方法的类。明显的意图是
magest
方法将使用
compareTo
方法来找出它的两个参数中哪个更大。。。然后把它还给我


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

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

  • JLS设计者必须在通用语法中选择使用
    实现
    扩展
    ,或者使用一些新的关键字或符号:

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

    • 允许
      实现
      扩展
      是多余的,可能会导致不必要的混淆

    • 根据
      implements
      extends
      关键字的其他用法,对于这些选择中的哪一个更好,(IMO)没有令人信服的论据。如果他们是根据掷硬币决定的,我不会感到惊讶


实施
实施
都无效。。。阅读。对不起,错别字我更正了,时间还早这整晚都在困扰着我啊,所以我可以扩展它,我的意思是,这不是比工具更有效吗?T Ag1和T ARG2是什么?我从未见过作为参数使用。N.B:我回滚我的编辑,因为滥用<代码>实现而不是<代码>扩展< /代码>可能是PAR。