Java ArrayList 向下转型
Java ArrayList Downcasting
所以我一直在一个项目中工作,在这个项目中,我需要一个列表来填充它的新 child class object。
我用传统的方法做到了,一个 ArrayList 将填充一种 child Class. 但是为了使代码更短而且效率更高,我正在考虑将 ArrayList 向下转换为具有 parent class 的单个 ArrayList,其中包含两个 child classes object它。可能吗?
这些是事物的parentclass
package Model;
public class Things {
protected String id;
protected String name;
protected double price;
protected int stock;
protected int bought;
public Things() {}
public Things(String id, String name, double price, int stock) {
this.id = id;
this.price = price;
this.name = name;
this.stock = stock;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public int getStock() {
return stock;
}
public void minusStock(int bought) {
this.stock = stock - bought;
}
}
这些是它的 child class 手机和代金券
手机childclass
package Model;
public class Handphone extends Things {
private String color;
public Handphone(String id, String name, double price, int stock, String color) {
super(id, name, price, stock);
this.color = color;
}
public String getColor() {
return color;
}
}
优惠券childclass
package Model;
public class Voucher extends Things {
private double tax;
public Voucher(String id, String name, double price, int stock, double tax) {
super(id, name, price, stock);
this.tax = tax;
}
public double getTax() {
return tax;
}
public double getsellingPrice() {
return (price + (price*tax));
}
}
所以提到主菜单界面会在不同的包上,我把import Model.*
放在上面。如果我这样说,它也会包含在菜单包中吗?
你可以把一个Handphone
和一个Voucher
放到List<Things>
中(Thing
可能是一个更合适的名字?),不需要转换:
List<Things> things = new ArrayList<>();
things.add(new Handphone("id", "name", 1, 1, "color"));
但是,如果您访问该列表并且确实需要知道它是 Handphone
还是 Voucher
,则必须向下转换对象。
这种类型的铸造可能是设计缺陷的迹象,因此请仔细考虑您的解决方案。
如果您将包含 class 本身的 protected
getter 字段包含到您的父级 class 中,那么将有可能在运行时知道是不是耳机、代金券或其他东西。
不过,请确保正如@Maglinex 所建议的那样,您所关注的不是设计缺陷。
所以我一直在一个项目中工作,在这个项目中,我需要一个列表来填充它的新 child class object。
我用传统的方法做到了,一个 ArrayList 将填充一种 child Class. 但是为了使代码更短而且效率更高,我正在考虑将 ArrayList 向下转换为具有 parent class 的单个 ArrayList,其中包含两个 child classes object它。可能吗?
这些是事物的parentclass
package Model;
public class Things {
protected String id;
protected String name;
protected double price;
protected int stock;
protected int bought;
public Things() {}
public Things(String id, String name, double price, int stock) {
this.id = id;
this.price = price;
this.name = name;
this.stock = stock;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public int getStock() {
return stock;
}
public void minusStock(int bought) {
this.stock = stock - bought;
}
}
这些是它的 child class 手机和代金券
手机childclass
package Model;
public class Handphone extends Things {
private String color;
public Handphone(String id, String name, double price, int stock, String color) {
super(id, name, price, stock);
this.color = color;
}
public String getColor() {
return color;
}
}
优惠券childclass
package Model;
public class Voucher extends Things {
private double tax;
public Voucher(String id, String name, double price, int stock, double tax) {
super(id, name, price, stock);
this.tax = tax;
}
public double getTax() {
return tax;
}
public double getsellingPrice() {
return (price + (price*tax));
}
}
所以提到主菜单界面会在不同的包上,我把import Model.*
放在上面。如果我这样说,它也会包含在菜单包中吗?
你可以把一个Handphone
和一个Voucher
放到List<Things>
中(Thing
可能是一个更合适的名字?),不需要转换:
List<Things> things = new ArrayList<>();
things.add(new Handphone("id", "name", 1, 1, "color"));
但是,如果您访问该列表并且确实需要知道它是 Handphone
还是 Voucher
,则必须向下转换对象。
这种类型的铸造可能是设计缺陷的迹象,因此请仔细考虑您的解决方案。
如果您将包含 class 本身的 protected
getter 字段包含到您的父级 class 中,那么将有可能在运行时知道是不是耳机、代金券或其他东西。
不过,请确保正如@Maglinex 所建议的那样,您所关注的不是设计缺陷。