如何实现泛型类型的接口?

时间:2014-06-06 04:48:56

标签: java generics interface comparator

我正在尝试编写一个实现Telemeter类的TelemeterTester类。遥测仪扩展了比较器。我一直收到这个运行时错误...

TelemeterTester.java:12: error: cannot find symbol
  return e1.compareTo(e2);
           ^
  symbol:   method compareTo(Comparable)
  location: variable e1 of type Comparable
  where Comparable is a type-variable:
  Comparable extends Object declared in class TelemeterTester
1 error  

以下是Telemeter接口的代码

/** @param <E> the type on which distance and order are defined
 *
 */
 public interface Telemeter<E> extends Comparator<E> {

   /**
    * Returns the distance between e1 and e2.
    *
    * @param e1 the first object
    * @param e2 the second object
    * @return the distance between e1 and e2
    *
    */
   double distance(E e1, E e2);
 }

这是我的TelemeterTester类的代码,它实现了Telemeter

public class TelemeterTester<Comparable> implements Telemeter<Comparable>{

   private TelemeterTester() {}

   public double distance(Comparable e1, Comparable e2) {
      return 0;
   }

   public int compare(Comparable e1, Comparable e2) {

      return e1.compareTo(e2);
   }

}

任何人都可以向我解释我做错了什么吗?我不太了解泛型,现在我已经被困在这个错误的变化上几个小时了。

3 个答案:

答案 0 :(得分:2)

这里的语法

public class TelemeterTester<Comparable> implements Telemeter<Comparable>{  

就像

一样
public interface Telemeter<E> extends Comparator<E> {

声明一个名为Comparable的类型参数,就像第二个声明一个名为E的类型参数一样。它没有使用Comparable作为类型参数。因此,这种方法

public int compare(Comparable e1, Comparable e2) {
    return e1.compareTo(e2);
}

为其参数使用无界类型。无界类型基本上为Object,而Object未声明compareTo(..)方法。

你应该阅读

继续之前。

答案 1 :(得分:2)

您的TelemeterTester应定义如下:

  public class TelemeterTester<E extends Comparable<E>> implements Telemeter<E> {
    private TelemeterTester() {
    }

    public int compare(E o1, E o2) {
        return o1.compareTo(o2);
    }

    @Override
    public double distance(E e1, E e2) {
        return 0;
    }
}

并称为:

   TelemeterTester<Integer> t = new TelemeterTester<Integer>();
   System.out.println(t.compare(2, 2));

记住类型Integer实现Comparable<Integer>

答案 2 :(得分:0)

&#34;任何人都可以向我解释我做错了什么?&#34; 您的测试仪属于Comparable类型,它扩展了Telemeter,它也是Comparable类型。

您真正想要的是测试扩展了一个通用对象,我们通常将其命名为E,并且您希望此对象扩展Es的类Comparable。例如,如果用E替换E,则更有意义:

公共类TelemeterTester&gt;实施遥测仪

&#34;我不太了解仿制药,而且我已经被困在这个错误的变化上几个小时了。&#34;

Josh Bloch在Youtube上有很棒的视频,他解释了PECS :)一旦你看到它就会有意义。

https://www.youtube.com/watch?v=V1vQf4qyMXg

您的代码应如下所示:

import java.util.*;

/** @param <E> the type on which distance and order are defined
*
*/
interface Telemeter<E> extends Comparator<E> {

  /**
   * Returns the distance between e1 and e2.
   *
   * @param e1 the first object
   * @param e2 the second object
   * @return the distance between e1 and e2
   *
   */
  double distance(E e1, E e2);
}

class TelemeterTester<E extends Comparable<E>> implements Telemeter<E> {

    private TelemeterTester() {}

    @Override
    public int compare(E o1, E o2)
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public double distance(E e1, E e2)
    {
        // TODO Auto-generated method stub
        return 0;
    }

 }

用您自己的代码替换TODO。