Java泛型,类型变量范围

4

这两者之间有何区别:

public <E>int  compareTo(E e) // first line (compilation error)

并且

public int compareTo(E e) // second line (OK)

只有在第二行中,我才通过了编译器。这是否意味着需要确保该特定元素在类中被普遍声明? 否则,您可以放入任何元素,但不会有太多意义。我理解得对吗?谢谢。


展示更多你的代码(特别是 E 是什么?)。 - NPE
另外,你的第一个例子是没有意义的,因为由于擦除,它与“public int compareTo(Object e)”相同。(方法中类型参数的有效用法通常需要在两个位置使用类型参数,以建立参数和/或返回类型之间的约束。) - millimoose
1
@感知 类型参数彼此遮盖: http://ideone.com/i3GXx8 (尽管如此,最好还是避免这种情况。) - millimoose
@millimoose +1,没错。 - Perception
@大家 在返回类型之前放置任何元素都会导致错误,好像无法正确覆盖方法签名。 - Rollerball
1
@Rollerball 不要说“一个错误”,而是说出具体的错误信息。如果这个错误与之前的不同,你应该接受帮助你解决原始问题的答案。如果这是一个不同于人们猜测的问题,那么你应该扩大你的问题描述,让它更加明确无误。 - millimoose
2个回答

2

在返回类型之前声明类型参数:

public <E> int compareTo(E e) 

您也可以在类级别上拥有一个<E>类型的参数,但方法级别的参数将会覆盖它。在这个问题中了解更多相关信息。


@zagyl 按照您的建议进行了编辑(打字错误),但仍然无法正常工作。它的行为就像方法签名没有被正确地覆盖一样。 - Rollerball
@zagyl 此外,我甚至无法输入<P>或任何其他字母。 - Rollerball
1
@Rollerball 如果你正在实现一个接口方法,那就是一个全新的问题。你的 compareTo() 方法仍然必须与接口声明兼容。 - millimoose
1
如果你只想实现Comparable,那么你不需要使方法泛型化。为什么要在compareTo()上使用类型参数呢? - zagyi

0
public <E extends String> int compareTo(E o) {  //1
}

根据您的编程需要,您可以考虑任何类,而不是使用String

上述情况是针对实现Comparable接口的类考虑的。

class SimpleClass<E> {  // 2
    E var;  
    public <E> int compareTo(E o) {         
        return 0;
    }
}

如果我们不实现Comparable接口,那么在//2处的上面的类将起作用。 E不需要扩展String(任何其他类)。


类型参数不需要被限制。 - millimoose
我们如何编写代码才能避免 public <E> int compareTo(E o) {} 抛出编译时错误呢?用户对在返回类型附近编写 <E> 表示好奇,那么我的回答是: - AmitG
1
@Rollerball,你的问题真的真的真的应该包括这样一个事实:如果你确实在做这个的话,那么你正在实现Comparable<String> - millimoose
即使我们有返回语句,@millimoose public <E> int compareTo(E o) {} 仍会抛出异常。 - AmitG
@millimoose 上述情况是针对Comparable接口考虑的。您所做的也是正确的。尝试创建一个实现Comparable接口的类。用户已经给出了compareTo方法,上述情况适用于Comparable接口实现。 - AmitG
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接