gpt4 book ai didi

java - 扩展一个通用的 holder 类,它只接受特定的对象吗?

转载 作者:行者123 更新时间:2023-11-29 07:31:39 24 4
gpt4 key购买 nike

我试图理解并完成尝试创建一个类的任务,该类扩展了一个接受所有类型类的通用类。到目前为止,我有这个工作。我正在尝试创建一个扩展通用持有人类的类,并让这个类只接受特定的对象。

例如,名为“ComputerOrder”的类不接受 Apple 或 Orange 对象,而只接受 ComputerPart 或外围设备对象,例如主板或打印机对象。坚持了2周。我一辈子都弄不明白这个概念。任何帮助将不胜感激。

abstract class Product{
protected float price;
abstract float price();
public String toString() {
return "Price = " + String.valueOf(price) + " ";
}
}

class Apple extends Product{}
class Orange extends Product{}

class ComputerPart extends Product{
public ComputerPart(float p){
price = p;
}
public float price() {
return price;
}
}

class Motherboard extends ComputerPart{
protected String manufacturer;
public Motherboard(String mfg, float p) {
super(p);
manufacturer = mfg;
}
public String getManufacturer() {
return manufacturer;
}
}

class Peripheral extends Product{
public Peripheral(float p) {
price = p;
}
public float price() {
return price;
}
}

class Printer extends Peripheral{
protected String model;
public Printer(String model, float p) {
super(p);
this.model = model;
}
public String getModel() {
return model;
}
}

class Cheese extends Product{
public Cheese(float p) {
price = p;
}
public float price() {
return price;
}
}

class Cheddar extends Cheese{
public Cheddar(float p) {
super(p);
}
}

class GenericOrder<T>{
public ArrayList<T> storage = new ArrayList<T>();
private static int counter = 1;
public final int id;
public T obj;
public GenericOrder(){
id = counter;
counter++;
}
public void add(T item){
storage.add(item);
}
public T get(int in){
return obj;
}
public void getId(){
System.out.println(this.id);
}
public String toString(){
String ret = "";
Iterator<T> it = storage.iterator();
while (it.hasNext()) {
ret += it.next() + "\n";
}
return ret;
}
}

class ComputerOrder extends GenericOrder {
public void add(ComputerPart in){
if(in instanceof ComputerPart){
storage.add(in);
}
}
}

public class Tme2{
public static void main(String[] args){
ComputerOrder com = new ComputerOrder();
com.add(new Motherboard("bla", 3.33f))
}
}

最佳答案

你可以这样做:

class ComputerOrder<T extends ComputerProduct> extends GenericOrder<T> {
//...
}

在这里,ComputerProduct是一个扩展 Product 的类以及您所有的计算机产品,例如 ComputerPartPeripheral扩展ComputerProduct .同样,您可以创建一个类 FoodProduct源自 Product , 从中 Apple , OrangeCheese派生:

class FoodOrder<T extends FoodProduct> extends GenericOrder<T> {
//...
}

声明<T extends ComputerProduct>是一个类型限制,确保所有类型的T源自 ComputerPart ,否则会出现编译错误。

ComputerOrder类仍然是通用的,因此您可以实例化所有计算机产品的订单:

ComputerOrder order = new ComputerOrder<ComputerProduct>();
// Add peripherals, printers, motherboards...
// Apples, ... will throw compiler errors...

但您也可以将其限制为仅外围设备:

ComputerOrder order = new ComputerOrder<Peripheral>();
// Add peripherals, printers,...
// Apples, motherboards (ComputerProduct, but NOT Peripheral) will fail...

关于java - 扩展一个通用的 holder 类,它只接受特定的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41317957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com