具有接口的泛型方法的边界类型参数?
Bounding type parameters of generic methods with interfaces?
所以我有相同方法的两个版本。
版本 1:
public static <T> int countGreaterThan(T[] anArray, T elem)
{
int count = 0;
for (T e : anArray)
{
if (e > elem)
count++;
}
return count;
}
版本 2:
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem)
{
int count = 0;
for (T e : anArray)
{
if (e.compareTo(elem) > 0)
count++;
}
return count;
}
Eclipse 抱怨 版本 1 因为 > 运算符只能在比较基元时使用,这对我来说很有意义。
因此,为了解决这个问题,互联网告诉我使用受 Comparable 接口限制的类型参数。这是我开始失去对正在发生的事情的把握......
根据我对接口的基本理解,实现接口的class必须为接口中声明的每个方法提供一个方法体。
因此,为什么 版本 2 不必像这样?
public int compareTo(T o)
{
//stuff for method body
}
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem)
{
int count = 0;
for (T e : anArray)
{
if (e.compareTo(elem) > 0)
count++;
}
return count;
}
^我知道这不是正确的语法,但我这样做只是为了说明我的问题,即为什么我不必为这种情况下 Comparable 接口中的方法。
请尽量用通俗易懂的方式解释。我一直在自学这些东西,所以简单的解释有助于我在研究主题时理解更技术性的方面进一步。
不好意思,让我澄清一下。
这是 Comparable 接口的代码:
public interface Comparable<T> {
public int compareTo(T o);
}
compareTo() 没有方法体,因为它是一个接口。为什么我不必为 compareTO() 手动编写一个主体,这样我就可以在我的 countGreaterThan() 方法中使用该接口?
是否因为该界面是 Java 集合框架的一部分(如果是这样请解释它是如何工作的)
这是我创建自己的界面的不同情况:
public interface Dance { //an interface
public void boogie(int count);
}
并且为了在不同的 classes 中实现该接口,我需要在那些 classes 中为 dance 接口中的方法编写方法体。
public class theMoonwalk implements Dance {
public void boogie(int count) {
System.out.println("Slide " + count + " times!");
}
public void mJ() {
System.out.println("Michael Jackson did this dance!");
}
public class theHustle implements Dance {
public void boogie(int steps) {
System.out.println("Step " + steps + " times!");
}
}
public class theJitterBug implements Dance {
public void boogie(int twists) {
System.out.println("Twist " + twists + " times!");
}
}
为什么我不必为 compareTo() 编写方法体(因为方法体不包含在 compareTo() 的 Comparable 接口中)?
T
最终引用的类型必须实现 Comparable<T>
,而不是您要声明类型绑定的 class。
为了让它更简单一点:为了使用您的 countGreaterThan
方法,数组和 elem
参数中包含的任何对象都必须是 Comparable
对象。
这意味着像这样的调用是可以接受的:
Integer[] foo = {1, 2, 3, 4, 5};
YourClass.countGreaterThan(foo, 2);
您的类型绑定到 Integer
,并且 Integer implements Comparable<Integer>
。
这是不可以接受的:
Object[] bar = {new Object(), new Object(), new Object()};
YourClass.countGreaterThan(bar, new Object());
您的类型绑定到 Object
,并且 Object
未实现 Comparable
。同样的逻辑适用于您实现的自定义对象;如果它没有绑定到 Comparable,那么它就不会在正确的范围内。
所以我有相同方法的两个版本。
版本 1:
public static <T> int countGreaterThan(T[] anArray, T elem)
{
int count = 0;
for (T e : anArray)
{
if (e > elem)
count++;
}
return count;
}
版本 2:
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem)
{
int count = 0;
for (T e : anArray)
{
if (e.compareTo(elem) > 0)
count++;
}
return count;
}
Eclipse 抱怨 版本 1 因为 > 运算符只能在比较基元时使用,这对我来说很有意义。
因此,为了解决这个问题,互联网告诉我使用受 Comparable 接口限制的类型参数。这是我开始失去对正在发生的事情的把握......
根据我对接口的基本理解,实现接口的class必须为接口中声明的每个方法提供一个方法体。
因此,为什么 版本 2 不必像这样?
public int compareTo(T o)
{
//stuff for method body
}
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem)
{
int count = 0;
for (T e : anArray)
{
if (e.compareTo(elem) > 0)
count++;
}
return count;
}
^我知道这不是正确的语法,但我这样做只是为了说明我的问题,即为什么我不必为这种情况下 Comparable 接口中的方法。
请尽量用通俗易懂的方式解释。我一直在自学这些东西,所以简单的解释有助于我在研究主题时理解更技术性的方面进一步。
不好意思,让我澄清一下。
这是 Comparable 接口的代码:
public interface Comparable<T> {
public int compareTo(T o);
}
compareTo() 没有方法体,因为它是一个接口。为什么我不必为 compareTO() 手动编写一个主体,这样我就可以在我的 countGreaterThan() 方法中使用该接口?
是否因为该界面是 Java 集合框架的一部分(如果是这样请解释它是如何工作的)
这是我创建自己的界面的不同情况:
public interface Dance { //an interface
public void boogie(int count);
}
并且为了在不同的 classes 中实现该接口,我需要在那些 classes 中为 dance 接口中的方法编写方法体。
public class theMoonwalk implements Dance {
public void boogie(int count) {
System.out.println("Slide " + count + " times!");
}
public void mJ() {
System.out.println("Michael Jackson did this dance!");
}
public class theHustle implements Dance {
public void boogie(int steps) {
System.out.println("Step " + steps + " times!");
}
}
public class theJitterBug implements Dance {
public void boogie(int twists) {
System.out.println("Twist " + twists + " times!");
}
}
为什么我不必为 compareTo() 编写方法体(因为方法体不包含在 compareTo() 的 Comparable 接口中)?
T
最终引用的类型必须实现 Comparable<T>
,而不是您要声明类型绑定的 class。
为了让它更简单一点:为了使用您的 countGreaterThan
方法,数组和 elem
参数中包含的任何对象都必须是 Comparable
对象。
这意味着像这样的调用是可以接受的:
Integer[] foo = {1, 2, 3, 4, 5};
YourClass.countGreaterThan(foo, 2);
您的类型绑定到 Integer
,并且 Integer implements Comparable<Integer>
。
这是不可以接受的:
Object[] bar = {new Object(), new Object(), new Object()};
YourClass.countGreaterThan(bar, new Object());
您的类型绑定到 Object
,并且 Object
未实现 Comparable
。同样的逻辑适用于您实现的自定义对象;如果它没有绑定到 Comparable,那么它就不会在正确的范围内。