我收到一条错误,指出“无法找到方法 - getCenter”但是每当我用“a,b或d”这样的单个对象替换“objects.get(i)”时,它就会发现方法很好。我不明白为什么它无法从ArrayList中找到该方法。
public class TestPoly
{
public static void main (String []args)
{
ArrayList objects = new ArrayList();
Circle2 a = new Circle2(33,10,4);
Cylinder2 b = new Cylinder2(21,15,40,5);
Oval2 c = new Oval2(3,7,34,10);
OvalCylinder2 d = new OvalCylinder2(5,11,5,5,7);
objects.add(a);
objects.add(b);
objects.add(c);
objects.add(d);
for (int i = 0; i < objects.size(); i++)
{
System.out.println("For " + objects.get(i).getClass().getName() + objects.get(i).getCenter());
}
}
}
Circle2就是这个。
public class Circle2
{
// instance variables
private int x;
private int y;
private int radius;
/**
* Constructor for objects of class circle
*/
public Circle2(int p_x, int p_y, int r)
{
// initialise instance variables
x = p_x;
y = p_y;
radius = r;
}
public int getRadius()
{
return radius;
}
public String getCenter()
{
return " the center is at (" + x + "," + y + ")";
}
}
Cylinder2,Oval2和OvalCylinder2都只是Circle2的子类。
答案 0 :(得分:5)
您尚未为ArrayList
声明Type参数或Type参数,因此默认为Object
。 Object
没有getCenter()
方法。
您可以将ArrayList
声明更改为:
ArrayList<Circle2> objects = new ArrayList<Circle2>();
Circle2 a = new Circle2(33,10,4);
objects.add(a);
objects.get(0).getCenter();
但它现在只能接受Circle2
个对象。
答案 1 :(得分:3)
您正在创建一个没有任何类型参数的ArrayList
,这意味着您将其创建为Raw Type。执行此操作时,从列表中获取对象时,需要将对象强制转换为适当的类型。
为了在这种情况下适当地运行代码,这是推荐的方法,请指定类似参数 -
// if you are using jdk 7 or above
ArrayList<Circle2> objects = new ArrayList<>();
或 -
ArrayList<Circle2> objects = new ArrayList<Circle2>();
详细了解generics here。
但是,如果您仍想使现有代码正常工作(不推荐),请使用此 -
ArrayList objects = new ArrayList();
Circle2 a = new Circle2(33,10,4);
Cylinder2 b = new Cylinder2(21,15,40,5);
Oval2 c = new Oval2(3,7,34,10);
OvalCylinder2 d = new OvalCylinder2(5,11,5,5,7);
objects.add(a);
objects.add(b);
objects.add(c);
objects.add(d);
for (int i = 0; i < objects.size(); i++)
{
Circle2 circle = (Circle2 )objects.get(i);
System.out.println("For " + circle.getClass().getName() + circle.getCenter());
}
不要以这种方式使用原始类型。它们并不意味着在新代码中使用,它们仅支持向后兼容性。从上面关于原始类型的链接 -
原始类型显示在遗留代码中,因为有很多API类(例如 在JDK 5.0之前,Collections类不是通用的。使用时 原始类型,你基本上得到了前仿制行为。
答案 2 :(得分:1)
你现在拥有的当前arraylist ......以“Object”为元素......结果......它的元素只支持在对象上定义的方法(toString,getHashcode等)
您可以定义类似的类型:
ArrayList<Circle2> objects = new ArrayList<Circle2>();
但是它只能接受circle类型的对象。以下行会导致错误:
objects.add(b);
objects.add(c);
objects.add(d);
更好的方法是使用继承...所以你将有一个名为shape的基类...它将有一个名为getCenter的方法,它将被子类覆盖(如果需要)
public abstract class Shape {
public String getCenter();
}
有四个类扩展形状类:
public class Cylinder extends Shape
public class Circle extends Shape
等等
所以现在你可以将你的arraylist作为:
ArrayList<Shape> shapes = new ArrayList<Shape>();
并在其中添加多个不同的形状:
shapes.add(new Circle())
shapes.add(new Cylinder())
...
以下代码是可能的
for(Shape shape : shapes)
System.out.println(shape.getCenter())
答案 3 :(得分:0)
ArrayList
(或任何其他集合)需要知道它将要存储的对象类。如果未指定,则假定您将存储Object
个实例。
要指定集合将存储的类,您需要在创建集合时包含类名:
// ...
ArrayList<Circle2> objects = new ArrayList<Circle2>();
// ...
现在,您可以阅读ArrayList
两种方式:
'数组'样式:您使用索引浏览ArrayList
中的每个条目:
for(i=0; i<objects.size(); i++) {
// Use objects(i) to get the Circle2 instance
}
'迭代器'样式:可以通过迭代集合来读取存储在集合中的对象:
for(Circle2 c : objects) {
/*
* The object 'c' stores every single Circle2 instance in your 'objects' list
*/
}
我建议您查看Collections
和Generics
教程: