Instantiate generic type in java

喜夏-厌秋 提交于 2019-12-23 08:29:12

问题


I'm stuck. Coming from C++ I thought this would simply work, but it does not. Can you please give me an advice? I will try to not end up with kind of creation method in each class used for T.

public class A<T>{

    private T t_;

    public A(){
        t_ = new T(); //error
    }

}  

Also i don't want to have constructor looking like: A(Class classT){ ... Ideally i would like to have something like this c++ code.

template<class T>
class A{
private:
   T t_;

public:
   A(){}

};

Thanks for help.


回答1:


You cannot do such things in Java. Read about type erasure: http://docs.oracle.com/javase/tutorial/java/generics/erasure.html




回答2:


Besides the issue of type erasure -- which makes this impossible in any event -- you simply can't guarantee that T has an exposed, no-argument constructor!

The traditional workaround is to pass around factory objects that provide methods that can be used to obtain T objects. A simplistic example would be

interface Factory<T> {
  T create();
}

and then your class can get a Factory<T> and call create() on it to get more Ts. More sophisticated examples might require additional arguments to a create method, for example, or overloads.

Less-pretty workarounds include explicit reflection, passing around Class<T> objects. For example, ArrayList.class.newInstance() returns a newly constructed raw ArrayList. You have to explicitly pass around the Class object, and the reflection-based approach is slower than a normal constructor or a factory object (even though the speed of reflection has been improving lately). You also depend on the class exposing a no-arg constructor, which isn't always the case. It can be made to work, but it's never what I'd call "pleasant."

(That said, for reference, there are indications that the situation may change somewhat in Java 8 with Project Lambda and friends.)




回答3:


Sorry to disapoint you but this is just plain impossible in java without constructors.

Java throws away the generic information at runtime (see type erasure)




回答4:


try this:

private <E extends ISomething> E createInstance(Class<E> clazz) {
        E ret;
        try {
            ret = clazz.newInstance();
            ret.setSomething(something);

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return ret;
    }


来源:https://stackoverflow.com/questions/10830865/instantiate-generic-type-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!