2015-06-02 83 views
-1

所以我有2个版本的相同的方法。带接口的泛型方法的边界类型参数?

版本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接口定界的类型参数。这是我开始失去对正在发生的事情的...

根据我对接口的基本理解,实现接口的类必须为接口中声明的每个方法提供一个方法体。

因此,为什么不版本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; 
    } 

^我得到的,这不是正确的语法,但我只是做它来说明,以我的问题是,为什么我没有写一个方法体在可比接口中的方法这个情况。

请尽量保持外行的解释。我一直在教自己这个东西,所以简单的解释帮助我更深入地研究主题的技术方面。


对不起,让我澄清。

下面是可比接口的代码:

public interface Comparable<T> { 
    public int compareTo(T o); 
    } 

没有为任何的compareTo方法体(),因为它是一个接口。为什么我不必为compareTO()手动编写一个正文,这样我就可以在我的countGreaterThan()方法中使用该接口了?

是因为该接口是Java Collections Framework的一部分(如果这就是为什么,请解释是如何工作的)

这里有不同的情况,我创造我自己的接口:

public interface Dance { //an interface 
    public void boogie(int count); 
} 

,并在为了在不同的类中实现这个接口,我需要在这些类的方法体中为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可比接口())?

+1

你问你为什么不必写'public int compareTo(T o)'方法吗? – Oli

+0

我不明白。包含'countGreaterThan'方法的类不必实现'Comparable' ...你能澄清你在这里问的是什么吗? – aioobe

+2

@Patrick泛型类型T必须实现'compareTo'方法,而不是包含泛型方法的类。 –

回答

3

T最终所指的类型必须实现Comparable<T>,而不是您声明绑定类型的类。

为了使其更简单一些:为了使用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,那么它不会在合适的范围内。

相关问题