如何将Java类转换为另一个类

Posted

技术标签:

【中文标题】如何将Java类转换为另一个类【英文标题】:How to cast Java class to another class 【发布时间】:2018-06-13 00:43:30 【问题描述】:

我使用一种方法从一个包中收集所有类并将它们保存到一个数组中:

Class[] classes = ClassUtils.getClasses("xyz.keahie.werewolf.character.characters");

它们都有“Character”类作为超类,当我打印它们时,我得到了这一行:

class xyz.keahie.werewolf.character.Character

当我想将它们转换为“Character”类时,我总是会收到 ClassCastException。我做错了什么?

编辑: 这是我得到的完整错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to xyz.keahie.werewolf.character.Character
    at xyz.keahie.werewolf.character.CharacterManager.<init>(CharacterManager.java:29)
    at xyz.keahie.werewolf.GameManager.<init>(GameManager.java:26)
    at xyz.keahie.werewolf.Game.main(Game.java:9)

这里是我的源代码:

Class[] classes = ClassUtils.getClasses("xyz.keahie.werewolf.character.characters");
for (Class clazz : classes) 
    Object object = clazz.getSuperclass();
    System.out.println(object.toString());

    if (object.getClass().equals(xyz.keahie.werewolf.character.Character.class)) 
        System.out.println("Yes");
     else 
        System.out.println("Nope");
    

    Character character = (Character) object;
    if (!this.characters.contains(character)) 
        addSpecialCharacter(character);
    

抱歉,开头缺少信息

【问题讨论】:

可能是您试图将其转换为错误的 Character 类 你能粘贴完整的错误吗,我怀疑它会显示迈克尔斯的答案是正确的。 我刚刚添加了完整的错误和我的源代码 【参考方案1】:

您不能从 Class&lt;Character&gt; 转换为 Character。前者描述了后者的

您可以使用Class.newInstance 获取实例,前提是Character 有一个不带参数的构造函数:

Character character = (Character) object.newInstance();

或者,如果您的 Character 类需要构造函数参数,您可以使用反射。看到这个问题:Instantiate a class object with constructor that accepts a string parameter?

如果需要从 Class&lt;?&gt; 实例化一个对象,我会仔细重新考虑您的软件设计,因为它很少需要。


谨慎命名你的班级Characterjava.lang.Character 可能会发生冲突。 java.lang 始终会自动导入,因此您有两个具有相同名称但冲突的类。因此,最好避免使用 java.lang 中已经存在的任何类名。

为避免这种情况,您可以使用包名完全限定类,如下所示:

xyz.keahie.werewolf.character.Character

最好为您的班级选择一个不那么含糊的名称。 GameCharacterPlayerCharacterRpgCharacter 可能是更好的选择。

【讨论】:

感谢您的提示,但不幸的是,导入的 Character 类是正确的。我也收到这条消息,但有例外:java.lang.Class cannot be cast to xyz.keahie.werewolf.character.Character 所以它必须是我的 Character 类而不是 java.lang.Character 类 @KeanuHie 谢谢。我已经更新了我的答案。希望有用。【参考方案2】:

您不能将 Class&lt;Character&gt; 转换为 Character。你的代码

Character character = (Character) object;

应该是

Class<Character> characterClass = (Class<Character>) object;

看起来你想从它的类中创建实例。我建议您学习一些有关 Java 反射的知识。也许像这样Creating an instance using the class name and calling constructor

【讨论】:

谢谢。现在可以了。我知道我应该更多地了解反射。您的链接对我帮助很大:)

以上是关于如何将Java类转换为另一个类的主要内容,如果未能解决你的问题,请参考以下文章

仅将 java 类实例转换为原始类型

Javascript / Typescript:以角度将一个数组类转换为另一个数组类

在 Java 中将值从一个类设置为另一个类

将 stdClass 对象转换/转换为另一个类

Java工具箱之字符编码工具类

将类转换为另一个类或将类转换为另一个