Klasse ArrayList: "cannot find symbol"
-
* ich habe eine Klasse namens Area2D in der Datei Area2D.java definiert
* diese Klasse besitzt eine statische Variable:private static ArrayList list = new ArrayList();
* eine weitere Klasse, paper.java, enthält die Klasse Paper sowie die main-Methode
* in der main-Methode werden der ArrayList-Variablen "list" mehrere Elemente hinzugefügt:Area2D.getList().add(new Area2D(0, 0, 10, -9.33, "ad 1")); Area2D.getList().add(new Area2D(0, 9.33, 10, -9.33, "ad 2")); // etc.
* schreibe ich nun direkt danach:
Area2D.getList().get(0).getX();
so bekomme ich die Meldung: "Cannot find symbol: method getX()"
Wieso???
-
Wenn ich statt der Klasse ArrayList die Klasse Vector benutze, bekomme ich übrigens dieselbe Fehlermeldung.
-
ArrayList (ebenso wie Vector/LinkedList/Map/HashMap etc.) ist eine generische Klasse. Wenn du sie ohne Typ benutzt, ist der Rückgabewert immer Object.
Probier es mal so:private static ArrayList<Area2D> list = new ArrayList<Area2D>();
-
Wenn ich allerdings das ArrayList-Object "list" von der Klasse Area2D in die Klasse Paper "verschiebe" und dann in der main-Methode statt
Area2D.getList().get(0).getX();
jetzt
list.get(0).getX();
schreibe, dann funktioniert es.
Wieso???
-
Poste mal bitte den kompletten Code mit den relevanten Sachen.
Wo ist getX() definiert?
-
getX() ist in der Klasse Area2D definiert.
Klasse Area2D
import java.util.Vector; public class Area2D { private double x; private double y; private double width; private double height; private String name; private String fileName; private static Vector<Area2D> list = new Vector(); /*************************************************************************** * constructor ***************************************************************************/ public Area2D(double _x, double _y, double _width, double _height, String _name) { x = _x; y = _y; width = _width; height = _height; name = _name; } /*************************************************************************** * get methods ***************************************************************************/ public double getX() { return x; } public double getY() { return y; } public double getWidth() { return width; } public double getHeight() { return height; } public String getName() { return name; } public String getFileName() { return fileName; } public static Vector getList() { return list; } /*************************************************************************** * set methods ***************************************************************************/ public void setX(double _x) { x = _x; } public void setY(double _y) { y = _y; } public void setWidth(double _width) { width = _width; } public void setHeight(double _height) { height = _height; } public void setName(String _name) { name = _name; } public void setFileName(String _fileName) { fileName = _fileName; } }
Klasse Paper
import com.pdflib.pdflib; import com.pdflib.PDFlibException; import java.text.DecimalFormat; import java.util.Vector; public class Paper { /*************************************************************************** * main method ***************************************************************************/ public static void main (String argv[]) { pdflib p = null; // create vector of Area2D objects // add elements to the Area2D vector // left column Area2D.getList().add(new Area2D(0, 0, 10, -9.33, "ad 1")); Area2D.getList().add(new Area2D(0, 9.33, 10, -9.33, "ad 2")); Area2D.getList().add(new Area2D(0, 18.66, 10, -9.33, "ad 3")); // middle column Area2D.getList().add(new Area2D(10, 0, 18, -7, "content 1")); Area2D.getList().add(new Area2D(10, 7, 18, -7, "content 2")); Area2D.getList().add(new Area2D(10, 14, 18, -7, "content 3")); Area2D.getList().add(new Area2D(10, 21, 18, -7, "content 4")); // right column Area2D.getList().add(new Area2D(28, 0, 10, -9.33, "affiliate")); Area2D.getList().add(new Area2D(28, 9.33, 10, -9.33, "content 5")); Area2D.getList().add(new Area2D(28, 18.66, 10, -9.33, "content 6")); try { /******************************************************************* * pre-work ******************************************************************/ // create new pdflib object p = new pdflib(); // define conversion between points and cm // (1 point = 1/72 inch = 2.54 / 72 cm = 0.03528 cm) double pointsPerCm = (1/0.03528); // define page dimension double pageWidthCm = 38.0; double pageHeightCm = 28.0; // begin new document if (p.begin_document("test.pdf", "") == -1) throw new Exception("Error: " + p.get_errmsg()); // begin new A4 page with origin of coordinate system in the upper left corner p.begin_page_ext(pageWidthCm * pointsPerCm, pageHeightCm * pointsPerCm, "topdown"); /* Scale the coordinate system to use metric coordinates. * By default, PDFlib will expect incoming coordinates in DTP points * which are defined as: 1 pt = 1/72 inch = 2.54/72 cm = 0.03528 cm. * In order to supply the coordinates in centimeters instead of points * we have to calculate the scaling factor as follows: * (72 points/inch) / (2.54 cm/inch) = 28.3465 points/cm. */ p.scale(pointsPerCm, pointsPerCm); /******************************************************************* * draw areas ******************************************************************/ // load font int font = p.load_font("Arial", "unicode", ""); if (font == -1) throw new Exception("Error: " + p.get_errmsg()); // set numerous attributes p.setfont(font, 1); p.setcolor("fill", "cmyk", 1.0, 1.0, 1.0, 1.0); p.setlinewidth(0.1); // draw area layout for(int i = 0; i < Area2D.getList().size(); i++) { // draw rectangular borders p.rect(Area2D.getList().get(i).getX(), Area2D.getList().get(i).getY(), Area2D.getList().get(i).getWidth(), Area2D.getList().get(i).getHeight());
Die Fehlermeldungen bekomme ich für jede der letzten vier abgebildeten Zeilen.
-
smax schrieb:
import java.util.Vector; public class Area2D { // . . . public static Vector getList() { return list; } // . . . }
getList() sollte Vector<Area2D> zurückgeben.
-
Du musst die Deklarierung mit dem generischen Typ auch komplett durchziehen.
Ich hab mal ein einfaches Beispiel geschrieben, welches den gleichen Grundaufbau wie deines benutzt:
// A.java import java.util.ArrayList; public class A { private double x; private static ArrayList<A> list = new ArrayList<A>(); public A(double x) { this.x = x; } public double getX() { return x; } public static ArrayList<A> getList() { return list; } }
// B.java public class B { public static void main(String[] args) { A.getList().add(new A(1.25)); A.getList().add(new A(0.52)); A.getList().add(new A(3.14)); for(int i = 0, n = A.getList().size(); i < n; i++) { System.out.println(A.getList().get(i).getX()); } } }
-
Danke Dasd und Ravendark für Eure hilfreichen Antworten!
-
Ich habe zwei weitere Fragen.
-
Sollte ich alle Klassenvariablen schon bei der Deklaration initialisieren (auch wenn zu diesem Zeitpunkt noch keine sinnvollen Werte feststehen und ich sie dann nur mit 0, "", etc. initialisieren kann) oder damit bis zum Konstruktor warten?
-
Was ist designtechnisch der beste Weg die Klasse Area2D zu gestalten? Sollte ich statt die Funktionalität für eine Fläche und für mehrere Fläche in der Klasse Area2D zu kapseln lieber die Funktionalität für eine Fläche in Area2D definieren und die Funktionalität für mehrere Flächen in einer davon abgeleiteten Klasse Area2DList beschreiben?
-
Wäre es nicht noch mehr im Sinne des Prinzips der Kapselung, wenn ich die Klasse Area2D so umschreibe, dass ich in Paper statt
Area2D.getList().add(new Area2D(0, 9.66, 10, 9.33, "ad 1", "gotmilk.pdf"));
es so schreiben kann:
[java]Area2D.addArea(new Area2D(0, 9.66, 10, 9.33, "ad 1", "gotmilk.pdf"));
Bin schon gespannt auf Eure Antworten!
-
-
Ich denke 1) und 2) sind eher Geschmackssache zu 3) gibts von mir ein klares Ja.