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

时间:2018-01-03 10:40:01

标签: java class casting

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

__unix__

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

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

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

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

class xyz.keahie.werewolf.character.Character

这是我的源代码:

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)

对于开头

中缺少的信息表示歉意

2 个答案:

答案 0 :(得分: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可能是更好的选择。

答案 1 :(得分: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