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

问题描述 投票:0回答:2

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

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);
    }
}

很抱歉在开始时缺少信息

java class casting
2个回答
1
投票

你不能把Class<Character>施放到Character。你的代码

Character character = (Character) object;

应该

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

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


5
投票

你无法从Class<Character>施放到Character。前者描述了后者的类。

你可以使用Class.newInstance来获得一个实例,Character有一个不带参数的构造函数:

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

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

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


小心命名你的班级Characterjava.lang.Character可能会发生冲突。 java.lang总是自动导入,因此您有两个具有相同名称且冲突的类。因此,避免使用java.lang中已存在的任何类名是一种好习惯。

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

xyz.keahie.werewolf.character.Character

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

© www.soinside.com 2019 - 2024. All rights reserved.