我不确定如何运行泛型类型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();
}
答案 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 ++模板进行。你必须对泛型类型非常具体。