当前位置: 首页 > 知识库问答 >
问题:

泛型类方法返回一些值

邓声
2023-03-14

我得到了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)

共有3个答案

卓宏达
2023-03-14

你有几个问题。

主要问题是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);

端木淇
2023-03-14

无法将[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的正确答案。

伯建安
2023-03-14

代码中有很多混乱和错误的假设。如果您使用的是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”的方法,所以最好在方法级别或类级别中声明泛型类型。