0

I use a method to collect all classes from a package and save them into an array:

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

They all have the class "Character" as superclass and when I print them I get this line:

class xyz.keahie.werewolf.character.Character

When I want to cast them to the class "Character" I always get an ClassCastException. What am I doing wrong?

Edit: Here is the full Error which I get:

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)

And here my source code:

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

Sorry for the missing information at the begin

Keanu Hie
  • 297
  • 2
  • 8
  • 12

2 Answers2

5

You cannot cast from Class<Character> to Character. The former describes the class of the latter.

You can use Class.newInstance to get an instance provided Character has a constructor which takes no arguments:

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

Alternatively, you can use reflection if your Character class requires constructor arguments. See this question: Instantiate a class object with constructor that accepts a string parameter?

I would carefully rethink your software design if need to instantiate an object from it's Class<?> because it is very rarely required.


Be careful with naming your class Character. java.lang.Character may conflict. java.lang is always automatically imported so you have two classes with the same name that are conflicting. It's good practice to avoid using any class names that are already present in java.lang for that reason.

To avoid this, you can fully qualify the class with the package name, like so:

xyz.keahie.werewolf.character.Character

Preferably, choose a less ambiguous name for your class. GameCharacter, PlayerCharacter or RpgCharacter might be better choices.

Michael
  • 41,989
  • 11
  • 82
  • 128
  • Thanks for the hint, but unfortunately the imported Character class is the right one. I also get this message with the exception: `java.lang.Class cannot be cast to xyz.keahie.werewolf.character.Character` So it must be my Character class and not the java.lang.Character class – Keanu Hie Jan 03 '18 at 12:07
  • @KeanuHie Thanks. I've updated my answer. Hope it's useful. – Michael Jan 03 '18 at 15:47
1

You can't cast a Class<Character> to Character. Your code

Character character = (Character) object;

should be

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

It looks like you want to create instance from its class. I recommend you to learn something about Java reflection. Maybe something like this Creating an instance using the class name and calling constructor

zhh
  • 2,346
  • 1
  • 11
  • 22