我使用一种方法从包中收集所有类并将它们保存到数组中:
__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)
对于开头
中缺少的信息表示歉意答案 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<?>
实例化对象,我会仔细重新考虑您的软件设计,因为它很少需要。
小心命名班级Character
。 java.lang.Character
可能会发生冲突。始终会自动导入java.lang
,因此您有两个具有相同名称且冲突的类。最好避免使用java.lang
中已存在的任何类名。
为避免这种情况,您可以使用包名完全限定类,如下所示:
xyz.keahie.werewolf.character.Character
最好为您的班级选择一个不太模糊的名称。 GameCharacter
,PlayerCharacter
或RpgCharacter
可能是更好的选择。
答案 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