gpt4 book ai didi

java - 获取Java中的

转载 作者:行者123 更新时间:2023-12-01 22:21:00 24 4
gpt4 key购买 nike

我有一个 Instrument 类。 小号管风琴长笛都扩展了乐器

我有一个“容器类” - Box,它是通用的。在Box中,我有一个Instrument数组,其中包含一种Instrument(Trumpet风琴长笛)。

我还有一个函数add,它将Instrument添加到数组中。

我有一个名为shop的类。在 shop 中,我有一系列盒子。

我有一个函数add,它将它作为参数获取的Instrument添加到它在数组中的位置(它发送到函数array[i]) .add - 在框中)。

我的问题是:如果我向函数发送一个对象 Frude ,它必须找到其 T 为 array[i]长笛

以下原文音译代码:

public class Driver {
public static void main(String[] args) {
Flute f = new Flute();
shop s = new shop();
s.add(f);
}
}

public class shop {
Box[] b = new Box[3];

public shop() {
b[0] = new Box<Flute>();
b[1] = new Box<Organ>();
b[2] = new Box<Trumpet>();
}

public void add(Instrument ins) {
int i;
//HOW CAN I FIND THE<T > of the BOX[ i]???;
for (i = 0; i < 3 && ins.getClass() != ? ; i++);
b[i].add(ins); //sends to function add in the class "Box"
}
}


public class Box<T> {
Instrument[5] arr= new Instrument();

int lastI = 5;

public void add(T item) {
arr[lastI++] = item;
}
}

最佳答案

除了语法错误之外,这里还存在一些概念问题。

  1. 您的Box类无法向其添加通用元素。

    使用正确的数组语法,它将如下所示:

    public class Box<T> {
    Instrument[] arr = new Instrument[5];

    int lastI = 5;

    public void add(T item) {
    arr[lastI++] = item;
    }
    }

    这不会编译,因为 T不是Instrument ,而且永远不会。

    如果您的目的是存储最多五种任何类型的乐器,则需要做两件事:

    • 您的通用界限需要更改,并且
    • 您需要添加边界检查以确保不会添加太多内容。

    幸运的是,两者都很容易实现:

    public class Box <T extends Instrument> {
    T[] arr = (T[]) new Object[5];

    int lastI = 5;

    public void add(T item) {
    if(lastI < arr.length) {
    arr[lastI++] = item;
    } else {
    throw new ArrayIndexOutOfBoundsException("Cannot add more than five elements to the array");
    }

    }
    }

    下限 <T extends Instrument>确保无论 T也就是说,它将是 Instrument 的实例或 Instrument 的子类.

  2. 创建 Box 的多个实例绑定(bind)到不同的类型,以便更轻松地添加元素。

    您的 add 的主要问题功能是你不知道是什么样的Instrument如果您关心,那么您应该明确哪个盒子包含什么。

    Box<Flute> fluteBox = new Box<>();
    Box<Organ> organBox = new Box<>();
    Box<Trumpet> trumpetBox = new Box<>();

    如果您不这样做,那么您可以创建一个最多只能容纳五件乐器的盒子:

    Box<Instrument> instrumentBox = new Box<>();

    后一种方法可能更容易,因为您只需将它们全部存储到一个框中,这使得以后查询更容易一些。

    如果您必须区分不同类型的仪器,那么您必须使用 instanceof这样做:

    public void add(Instrument instrument) {
    if(instrument instanceof Flute) {
    fluteBox.add(instrument);
    } else if(instrument instanceof Organ) {
    organBox.add(organ);
    } else {
    // et cetera
    }
    }

关于java - 获取Java中的<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29778162/

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