gpt4 book ai didi

java - 使用泛型方法时抛出 Class Cast Exception

转载 作者:行者123 更新时间:2023-12-04 05:30:55 24 4
gpt4 key购买 nike

因此,我将二维数组用于我正在开发的平台游戏物理系统。不幸的是,二维数组由于各种原因需要泛型类型。

我正在使用一些 java 集合(准确地说是链表)动态构建表面,然后使用一些技巧将它们转换为二维数组。这目前有效,给了我适当的二维通用数组:*

LinkedList<PhysSurface<P>> leftSurfaces = new LinkedList<PhysSurface<P>>();
LinkedList<PhysSurface<P>> rightSurfaces = new LinkedList<PhysSurface<P>>();
LinkedList<PhysSurface<P>> topSurfaces = new LinkedList<PhysSurface<P>>();
LinkedList<PhysSurface<P>> bottomSurfaces = new LinkedList<PhysSurface<P>>();

// Add surfaces to the lists

GenericArray<PhysSurface<P>[]> base = new GenericArray<PhysSurface<P>[]>(4);
PhysSurface<P>[][] surfaces = base.elements();
surfaces[0] = leftSurfaces.toArray(new GenericArray<PhysSurface<P>>().elements());
surfaces[1] = rightSurfaces.toArray(new GenericArray<PhysSurface<P>>().elements());
surfaces[2] = topSurfaces.toArray(new GenericArray<PhysSurface<P>>().elements());
surfaces[3] = bottomSurfaces.toArray(new GenericArray<PhysSurface<P>>().elements());

但是,当我尝试将所有这些都放入这样的通用静态方法中时:
@SuppressWarnings("unchecked")
public static <T> T[][] to2DArray(Collection<T>... collections)
{
GenericArray<T[]> base = new GenericArray<T[]>(collections.length);
T[][] array = base.elements();
for(int i = 0; i < collections.length; i++)
array[i] = collections[i].toArray(new GenericArray<T>().elements());
return array;
}

然后我像这样调用方法:
PhysSurface<P>[][] surfaces = GenericsUtils.to2DArray(leftSurfaces, rightSurfaces, topSurfaces, bottomSurfaces);

然后一切都崩溃了,给了我一个 ClassCastException,说它不能将类型 Object 转换为类型 PhysSurface。堆栈跟踪在这里:
Exception in thread "main" java.lang.ClassCastException: [[Ljava.lang.Object; cannot be cast to [[Lcom.meg.utils._2D.platformer.phys.environment.surface.PhysSurface;
at com.meg.chaos_temple.test.world.PhysTestWorld$TestMap.<init>(PhysTestWorld.java:487)
at com.meg.chaos_temple.test.world.PhysTestWorld$TestPlayer.<init>(PhysTestWorld.java:245)
at com.meg.chaos_temple.test.world.PhysTestWorld.<init>(PhysTestWorld.java:95)
at com.meg.chaos_temple.main.ChaosDebug.createWorld(ChaosDebug.java:72)
at com.meg.jrabbit.engine.main.BaseGame.start(BaseGame.java:56)
at com.meg.jrabbit.engine.loop.Loop.run(Loop.java:44)
at com.meg.jrabbit.engine.main.BaseGame.run(BaseGame.java:40)
at com.meg.jrabbit.engine.main.StandardGame.run(StandardGame.java:85)
at com.meg.chaos_temple.main.ChaosDebug.main(ChaosDebug.java:19)

据我所知,泛型方法没有使用泛型类型 T,而是默认创建一个 Object[][] 并在它返回时尝试转换。如果这是正在发生的事情,为什么将其放入静态方法时不起作用?如果不是,那到底是怎么回事?


  • (GenericArray 是一个自定义类,它使用可变长度参数来绕过创建泛型数组的常见障碍,然后包装结果。实际的构造函数是 GenericArray(T... elements)。)
  • 最佳答案

    不幸的是T[][] arrayObject[][] array 相同在运行时。通用类型参数将在运行时删除;只有编译器知道它。

    解决方法是传递对象的类:Class<T> .

    import java.reflect.Array;

    ...

    public static <T> T[][] to2DArray(Class<T> klazz, Collection<T>... collections)
    {
    T[][] array = (T[][]) Array.newInstance(klazz, collections.length,
    collections[0].size());
    //...
    array[i] = (T[]) Array.newInstance(klazz, collections[i].size());
    return array;
    }

    Array.newInstance 的强制转换对于多维结果是必要的。
    没有了 @SuppressWarnings("unchecked") !

    而不是通过 collections[0].size()通过 0大概就够了.

    关于java - 使用泛型方法时抛出 Class Cast Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12640457/

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