我得到了ClassCastException。我正在遵循这个答案,但没有得到正确的答案。将对象转换为通用类型以返回
BubbleSort.java
import java.util.ArrayList;
import java.util.List;
public class BubbleSort<T extends Number> {
public List<T> list;
@SuppressWarnings("serial")
public BubbleSort() {
list = new ArrayList<T>() {
};
}
public void add(T obj) {
list.add(obj);
}
public void sort() {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size() - 1; j++) {
if (list.get(j).intValue() > list.get(j + 1).intValue()) {
T swapElement = list.get(j);
list.set(j, list.get(j + 1));
list.set(j + 1, swapElement);
}
}
}
}
public <T> T getArray(Class<T> clazz){
T[] returnArray = (T[]) list.toArray();
return clazz.cast(returnArray);
}
}
MainPorgram.java
import java.lang.reflect.Array;
public class MainProgram {
public static void main(String args[]){
BubbleSort<Integer> bubbleSort = new BubbleSort<>();
bubbleSort.add(new Integer(1));
bubbleSort.add(new Integer(2));
bubbleSort.add(new Integer(6));
bubbleSort.add(new Integer(5));
bubbleSort.add(new Integer(4));
bubbleSort.add(new Integer(3));
Class<Integer[]> intArrayType = (Class<Integer[]>) Array.newInstance(Integer.TYPE, 0).getClass();
Integer[] sortedArray = (Integer[]) bubbleSort.getArray(intArrayType);
for(int i = 0 ; i < sortedArray.length; i++){
System.out.println(sortedArray[i]);
}
}
}
安慰
线程“main”Java . lang . classcastexception中出现异常:无法转换[ljava . lang . object;to [I at java.lang.Class.cast(未知来源)at bubble sort . get array(bubble sort . Java:32)at main program . main(main program . Java:15)
你有几个问题。
主要问题是list.toArray()
返回一个Object[]
,您不能将其强制转换为不同类型的数组。您应该使用
您的代码的另一个问题是您在方法
中声明的泛型参数
这里有一个建议的修复方法:
public T[] getArray(Class<T> clazz) {
return (T[]) list.toArray((T[])Array.newInstance (clazz, list.size()));
}
....
Integer[] sortedArray = bubbleSort.getArray(Integer.class);
无法将[Ljava.lang.Object;
强制转换为[I
。。。
这条消息可能会让你感到困惑。这里< code >[ljava . lang . object;实际上表示类型< code>Object[],而< code>[I表示< code>int[]。这些是Java类型的签名,可以根据https://stackoverflow.com/a/8066268/224671.解码
因此,错误消息抱怨您正在尝试将Object[]
转换为int[]
。您引用int
类型的唯一地方是这一行:
Class<Integer[]> intArrayType =
(Class<Integer[]>) Array.newInstance(Integer.TYPE, 0).getClass();
问题是你正在使用< code>Integer。TYPE返回< code>int的类型,因此您得到的类将是< code>Class
Class<Integer[]> intArrayType =
(Class<Integer[]>) Array.newInstance(Integer.class, 0).getClass();
// ^~~~~
(有关差异,请参阅 Integer.class 和 Integer 之间的区别。TYPE。
请注意,由于您已经知道将处理Intger[]
类,因此无需调用. getClass()
,只需这样就足够了:
Class<Integer[]> intArrayType = Integer[].class;
但这仍然是错误的,例如在
public <T> T getArray(Class<T> clazz){
T[] returnArray = (T[]) list.toArray();
您将断言获得一个< code>Integer[][](以及更多我不打算详细讨论的问题)...请参见@Eran的正确答案。
代码中有很多混乱和错误的假设。如果您使用的是Java 8,我将建议一种更简单的工作方法,而不是详细介绍所有这些方法(其他答案中已经介绍了一些):
public class BubbleSort<T extends Number> {
public List<T> list;
public BubbleSort() {
list = new ArrayList<T>();
}
//...
public T[] getArray(IntFunction<T[]> arrayGenerator) {
return list.stream().toArray(arrayGenerator);
}
}
public class MainProgram {
public static void main(String args[]) {
BubbleSort<Integer> bubbleSort = new BubbleSort<>();
//...
Integer[] sortedArray = bubbleSort.getArray(Integer[]::new);
//...
}
}
问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的
Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?
对于一堆带有泛型的包装类,我的继承结构遇到了一些麻烦。这基本上是结构: 这将与当前代码一起编译和工作,但是,这似乎很危险。如果调用方像这样使用这个方法:,它将很好地编译,但是如果findMiddle尝试返回SubBWrapper,则在运行时会有一个ClassCastException。我以为行得通却行不通的是: 所以我的问题基本上是,有没有正确的方法来编写编译、运行并遵循最佳实践的方法findMi
这是我的场景,我有三节课。 这里translate方法返回动物对象,但我需要使用相同的方法返回狗和猫类型,而不需要进行类型转换。我知道我必须在这里使用泛型,但是我如何编辑translate方法来支持泛型,这样我就可以将类类型传递给它的参数,如果使用Cat参数调用它就返回Cat对象,如果使用动物参数调用它就返回动物对象,如果使用Dog参数调用它就返回Dog对象。 例如:-而不是 Cat newCat
类具有类似类型的方法(让我们称其为收集器)。我认为这些方法可以通过使其返回一个包装泛型值的类来实现。 这是示例代码 此代码产生错误 我知道我可以通过使用泛型值创建收集器类来解决这个问题。我希望Collector类是单例的,我是指bean。所以我不能这么做。 有办法吗?
现在我希望以泛型的方式使用这些类。 如何从方法“method1”和“method2”返回泛型类型(可以是猫或狗)。我有几个返回“T extends Animal”的方法,所以最好在方法级别或类级别中声明泛型类型。