2016-10-04 6 views
1

Ich bin mir nicht sicher, wie Sie eine Methode des generischen Typs Point ausführen. Angenommen, die folgenden KlassenRun-Methode eines generischen Typs

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;} 
} 

die gleiche Methode getF1() und ein Verfahren zu teilen

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); 
} 

Wie die Methode getF1() mit dem Point1 Typ für den generischen Typ (Punkt = Point1 zugeordnet laufen) Ist es möglich, die Schnittstelle zu verwenden

public interface ICoord { 
    double f(); 

und

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

'Point1' und' Point2' müssten eine gemeinsame Oberklasse oder Schnittstelle haben, um sich auf sie allgemein beziehen zu können. – Taylor

+1

Was ist 'Punkt'? Sehe seine Definition nicht. –

+0

@Sabir: hier Punkt = Punkt1 – justik

Antwort

3

Es sieht wie Sie gerade die Definition von Point hier fehlt.

public interface Point { 
    double getF1(); 
} 

Dies bedeutet auch, dass jeder Ihrer Point Klassen zur Implementierung dieser Schnittstelle würde:

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

... und dann können Sie es verwenden, aber Sie würden die allgemeinen Parameter nicht brauchen bei alle.

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

Entfernen Sie den Kommentar in der Schleife, es könnte irreführend sein;) – AxelH

+1

@AxelH: Guter Fang; Wenn Sie in einer Antwort so etwas sehen, scheuen Sie sich nicht, eine Änderung vorzuschlagen. Ich hätte das genehmigt. – Makoto

1

Zuerst müssen Sie die getF1() Methode extrahieren:

private interface PointWithF1 { 
    public double getF1(); 
} 

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

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

Dann können Sie einen gebundenen generischen Typ definieren:

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

Aber dann können Sie einfach die Schnittstelle zu:

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

Also der Punkt ist (kein Wortspiel beabsichtigt), dass Java-Generics nicht alle diese Kompilierzeit-Typüberprüfung wie C++ - Vorlagen durchführen können. Sie müssen mit den generischen Typen auch sehr spezifisch sein.

Verwandte Themen