简体   繁体   中英

InstantiationException when Instantiate generic type in java

I have been trying to get this to work for a while and I have searched high and low for answers (including here). But I can't figure it out.

So here the code (a bit minimized):

public class Event<T> {
    public MessageType msgType;
    public int layer;
    public int gameObjectId;
    public String name;
    public float value;
    public int senderId;
    public T ext;

    public Event(Class<T> classType) {
        if(classType != null) {
            try {
                ext = classType.newInstance();  //this is the failing line
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        msgType = MessageType.NONE;
        layer = TypeHandler.lAll;
        gameObjectId = -1;
        name = null;
        value = -1;
    }
}

public class DataExtension {
    public float[] values;
    public String[] string;
    public Object[] objects;
    public boolean[] boolens;
}

This is the problem:

Event<DataExtension> mSelectionEvent;

mSelectionEvent = new Event<DataExtension>(DataExtension.class, MessageType.SELECTED);

This give me the following exception:

java.lang.InstantiationException: se.plainentertainment.bagl.v2.core.Event$DataExtension
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at se.plainentertainment.bagl.v2.core.Event.<init>(Event.java:85)
    at se.plainentertainment.bagl.v2.core.SelectionHandler.<init>(SelectionHandler.java:46)...

So, the class that I'm trying to instantiate should meet all the requirements, right? It has a default constructor and it's not abstract in any way. Why do I get this error?

Thanks in advance!

Event$DataExtension

This is an inner class. Is it static? I'm going to go with a hunch and say no. Which means it contains a reference to the containing Event (implicitly), which means you likely can't instantiate it via newInstance.

Try setting it to be a static inner class, or move it out of the class it if it doesn't need to be tied to the event object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM