6 回答
TA贡献1831条经验 获得超9个赞
我想纠正这个:
但是当我使用泛型时,我有多种数据类型
泛型需要同质的数据类型。例如, aList<Integer>
是一个只能容纳 an 的列表Integer
,而 aList<? extends Number>
只能容纳Number
s,它涵盖了其他数字类型,如Long
、Short
、等……但由单一类型Double
引用。Number
无论如何,您正在寻找的是一个 Bag - 一个可以容纳任意对象的集合。您可以使用 anObject[]
或 a来实现这一点List<Object>
,并且当您想要使用它时,您必须检查提取的每个元素的类型,因为在 Java 中没有办法拥有异构数据类型,这就是您所需要的。正在寻找。
TA贡献1815条经验 获得超10个赞
在我看来,数组不太适合解决这个问题,你应该使用对象。
这不是对你的问题的直接答案,而是以重新设计的形式给出的答案。
首先,让我们解决您关于泛型和数组的陈述。数组是协变的并且保留的,而泛型是不变的并且被删除的。
协变意味着什么时候
B extends A
,就可以 WriteA[] aArray = new B[someSize];
。不变意味着这是不可能的:ArrayList<A> aList = new ArrayList<B>();
将导致编译时错误。保留意味着有关类型的信息在运行时保留:数组总是“知道*其元素的类型。擦除意味着编译后类型信息消失。这也称为类型擦除。
协变和保留与不变和擦除的混合很可能会给你带来麻烦。ArrayList
这就是为什么使用 anObject[]
而不是 aT[]
作为其支持数据结构的原因。
现在到实际问题。正如其他人已经说过的,我们可以沿着这条路创建一个Object[]
. 我强烈建议不要这样做,因为我们丢失了所有类型信息。取回该信息的唯一方法是检查instanceof
,这会使您的代码变得严格。想象一下您更改条目的类型。在这种情况下,instanceof
will 返回false
,可能会导致不需要的行为,并且(最好的情况)一些测试变成红色,或者(最坏的情况)我们可能不会注意到它。
现在如何解决这个问题?我们创建一个代表(我推断的是)匹配结果的类:
public class MatchResult {
private final int firstTeamScore;
private final int secondTeamScore;
public MatchResult(final int firstTeamScore, final int secondTeamScore) {
this.firstTeamScore = firstTeamScore;
this.secondTeamScore = secondTeamScore;
}
public int getFirstTeamScore() {
return firstTeamScore;
}
public int getSecondTeamScore() {
return secondTeamScore;
}
public String getResultForFirstTeam() {
if (firstTeamScore > secondTeamScore) {
return "Win"; // In an actual implementation, I would replace this with an enum
} else if(firstTeamScore = secondTeamScore) {
return "Tie";
} else {
return "Lose";
}
}
// You can add a method public String getResultForSecondTeam(), I omitted it for brevity
}
我们赢得了什么?我们有类型。分数始终为int
s,结果始终为String
s。例如,如果我们将getReultforFirstTeam()
from的类型更改String
为 an Enum
,那么我们将在类型不再匹配的所有位置得到编译器错误。因此,我们磨练了快速失败设计,并被迫在必要时修改代码。因此,我们甚至没有机会再犯以前的那些偷偷摸摸的、不受欢迎的行为。
TA贡献1803条经验 获得超6个赞
outcome = {7, "Tie" , 9.0};
根本不合法。
您只能使用此语法 -数组初始值设定项,其中在等于之后省略元素类型 - 在变量声明中,例如
Object[] outcome = {7, "Tie" , 9.0};
TA贡献1921条经验 获得超9个赞
处理此问题的一种方法是创建一个Object可以容纳所有数据类型的数组
Object[] outcome = {7, "Tie" , 9.0};
之后您可以访问如下对象:
if(outcome[0] instanceof Integer){
Integer i = (Integer) outcome[0];
}
反之亦然..
TA贡献1807条经验 获得超9个赞
如前所述,您可以使用对象数组。或者,您可以使用泛型类。这是一个例子:
public class Queue<E> {
private ArrayList<E> queue;
/**Unparametrized constructor**/
public Queue() {
queue = new ArrayList<E>();
}
/**Enqueues an element into the queue.**/
public void enqueue(E val) {
queue.add(val);
}
/**Dequeues an element from the queue.**/
public E dequeue() {
E output = queue.get(0);
queue.remove(0);
return output;
}
/**Gets the current size of the queue.**/
public int size() {
return queue.size();
}
}
TA贡献1856条经验 获得超11个赞
您将必须创建一个对象数组,因为 java 中的所有对象extends Object:
Object[] arr = new Object[3];
//to add objects to it:
arr[0]=new String("element at index 0");
arr[1]=new Integer(1);
arr[2]=new Character('2');
要查找索引 x 处的对象是否是(例如),那么Integer您必须使用强制转换:
int x = (Integer)arr[x]; //x could be 0 or 1 or 2
您也可以使用以下方法来做到这一点ArrayList:
List<Object> listObjects = new ArrayList<Objects>();
添加回答
举报