java – How does a '.class' property work?-ThrowExceptions

Exception or error:

First time developing in Java, and first time developing for Android, so it’s quite a newbie question.

I currently have this code:

public void onBtnClicked(View v){
    /** Handles button navigation */

    @SuppressWarnings("rawtypes")
    Class c;
    int viewId = v.getId();

    switch (viewId) {

    case R.id.btnNewTourny :
        c = NewTourny.class;
        break;
    case R.id.btnTeamEditor :
        c = EditTeam.class;
        break;
    case R.id.btnCatEditor :
        c = EditCat.class;
        break;
    case R.id.btnLoadTourny :
        c = EditCat.class;
        break;
    case R.id.btnNewCategory :
        c = NewCat.class;
        break;
    default :
        c = Main.class;
    }

    Intent myIntent = new Intent(v.getContext(), c);
    startActivityForResult(myIntent, 0);
}

Short question:

What does the .class property do, f.ex. in ‘c = NewTourny.class‘?

Why can’t I cast c as Tourny (which is the parent of all these classes)?

Long question:

This currently handles all button navigations throughout my app, and works fine. However, as you can see, I’ve suppressed a ‘rawtype’ warning, that comes when I cast c as a Class .
Now, I really want a code without warnings, so I thought ‘well, all these classes are a child of ‘Tourny”, so I thought it would work, casting c as Tourny – but that does not work. Then I realised, that I didn’t really know what the code “NewTourny.class” actually did, and that may be the clue to why I couldn’t cast c as Tourny. So, what does .class do?

How to solve:

It doesn’t really do much. NewTourney.class is more of a language specific way to write “the object which is the Class of NewTourney“. This shorthand allows one to refer to the class of a NewTourney, as opposed to dealing with specific already existing instances of NewTourney.

In your specific case, I would hazard to guess that the Activity eventually creates an instance of the class to handle the action, or at least to hold the action’s context sensitive data.

###

Instances of the class where Class represent classes and interfaces in a running Java application. This is part of java Reflection API. From Oracle tutorial:

If the type is available but there is no instance then it is possible to obtain a Class by appending “.class” to the name of the type. This is also the easiest way to obtain the Class for a primitive type.

Here are some references:

  1. https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
  2. https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

###

Class is a class that represents classes. 🙂

It is not “Object”. It is not a superclass or even in your “NewTourny” hierarchy. That is why you can’t cast from a NewTourney to a Class.

The .class property is an instance of Class that represents type information.

You can use it to do reflective style calls to instantiate something you don’t know the type of at compile time.

###

To get rid of the warning, you can change Class c with Class<? extends Tourny>. This means c is not an object, that represents one of all possible classes, but more specifically represents a class derived by Tourny.

###

The .class method is one all objets have which allow you to reference the original nature of that object from before you even had a chance to initialize it. It’s not the parent, it’s the original unadulterated template of itself. It’s called “.class” because it’s a direct representation of the class that only the class definition can influence. It saves you from having to make a new object in order to obtain information all members of that class originally have in common.

Leave a Reply

Your email address will not be published. Required fields are marked *