运行泛型类型的方法

时间:2016-10-04 14:52:51

标签: java generics methods

我不确定如何运行泛型类型Point的方法。假设以下类

class Point1 {
      double x, y;
      public Point1 (double x_, double y_) {x=x_; y = y_;}
      public double getX() {return x;}
      public double getF1() {return x;}
}

class Point2 {
      double lat, lon;
      public Point2 (double lat_, double lon_) {lat = lat_; lon = lon_;}
      public double getLat(){return lat;}
      public double getF1() {return lat;}
}

共享相同的方法getF1()和方法

public <Point> void test(List<Point> points) {
  for (Point point:points) 
      double x = point.getF1();   //Error Can not find symbol getF1()
}

public static void main (String [args]) {
   List <Point1> points = new ArrayList<>();
   test(points);
}

如何运行与泛型类型Point(Point = Point1)的Point1类型相关联的方法getF1()?是否可以使用界面

public interface ICoord {
    double f();

public <Point> void test(List<Point> points, ICoord function) {
  for (Point point:points) 
      double x = point.function.f();
}

2 个答案:

答案 0 :(得分:3)

看起来你似乎错过了Point的定义。

public interface Point {
    double getF1();
}

这也意味着您的每个Point类都必须实现此接口:

public class Point1 implements Point { }
public class Point2 implements Point { }

...然后你可以使用它,但你根本不需要通用参数。

public void test(List<Point> points) {
  for (Point point: points) {
      double x = point.getF1();
  }
}

答案 1 :(得分:1)

首先,您需要提取getF1()方法:

private interface PointWithF1 {
    public double getF1();
}

private static class Point1 implements PointWithF1 {
    // ...
}

private static class Point2 implements PointWithF1 {
    // ...
}

然后您可以定义绑定的泛型类型:

public <Point extends PointWithF1> void test(List<Point> points) {
      for (Point point : points) {
          double x = point.getF1();  //Okay now
      }
}

但是,你也可以简单地使用界面:

public void test(List<PointWithF1> points) {
      for (PointWithF1 point : points) {
          double x = point.getF1();  //Okay now
      }
}

所以重点是(没有双关语)java泛型不能将所有那些编译时类型检查作为C ++模板进行。你必须对泛型类型非常具体。