- 主题:ArrayList<Shape> 里add new object
问题描述:
有一个Shape, rectangle, circle 继承此类;
有一个List, List<Shape>.
现在我想写一个方法,
addMoreToList(ArrayList<Shape> list, int i){
Class c = list.get(0).getClass();
Shape s = (Shape) c.newInstance()
list.add(s);
}
往list里面添加i个新对象。比如本身是list<circle>, i = 1, 那么再加入一个circle对象。
我是这么想的: 如果用反射,在方法里获得具体的shape类是可以实现的,
Class c = list.get(0).getClass();
但是接下来生成对象怎么写?
Shape s = (Shape) c.newInstance()
这样写的话,生成的还是shape,并不是具体的circle或者 rectangle.
求指教
--
修改:tortelee FROM 223.166.166.*
FROM 223.166.166.*
new出来的是object啊,不加转换(shape),编译报错,说new出来的是object.
加了转换就成了shape,并不是我想要的circle
【 在 guestking 的大作中提到: 】
: c实际是什么类型,new出来的就是什么类型,可以被转换成Shape是因为他是父类
:
--
FROM 39.144.39.*
那这个问题怎么解决呀? 就比如 贪吃蛇,我用一个list<shape> 表示,(shape表示蛇单元的形状)。
然后蛇吃了东西,list要变长。除了上面的copy 还有其他法子没
【 在 PaoloMaldini 的大作中提到: 】
: re,代码就不是楼主那写法
:
--
FROM 223.166.166.*
* 子类对象is-a关系概念错误
Class c = list.get(0).getClass(); (1)
Shape s = (Shape) c.newInstance(); (2)
你这样得到的是一个c对应的对象而不是Shape对象。事实上Shape可以是抽象类。
Cicle is a Shape
你拿到的就是Circle对象
============================
第二步,初始的目的是为了获得c new出的对象引用,然后加到list中。 在不清楚,c具体类型的情况下,
貌似只能这样获得这个引用吧。
Q: shape如果是抽象类,会怎么样?
* 容易出错的设计
newInstance()调用的是无参构造。如果某个子类定义的构造函数有参数那么就会出错
List<Shape里可以有多个不同的子类。你的实现默认就只考虑了第一个。
============================
嗯,这点赞同
* 范型错误
如果你手头的对象是List<Circle>,那你是不能将它作为一个List<Shape>传递的。
你需要将型参声明为List<? extends Shape>
===========================
手头的对象,可能是List<Circle> 或者 List<Rectangle> 。 我是想做个贪吃蛇,蛇的基本单元可能是圆形,也可能是矩阵。所以就这么写了。
那就用List<? extends Shape> ?
谢谢啦
【 在 here080 的大作中提到: 】
: 槽点过于密集,我一个一个说:
: * 子类对象is-a关系概念错误
: Class c = list.get(0).getClass();
: ...................
--
FROM 223.166.166.*
stackoverflow上 也有人这么写
https://stackoverflow.com/questions/49939675/how-to-create-new-object-of-generic-type-t-from-a-parametrized-listt
How to create new object of Generic Type T from a parametrized List<T>
public class TestClass {
public static <T> void method(List<T> objects) throws Exception {
for (int i = 0; i < objects.size(); i++) {
// Create new object of the same class
T obj = (T) objects.get(i).getClass().newInstance();
}
}
}
--
修改:tortelee FROM 223.166.166.*
FROM 223.166.166.*