I would like to create an object of Generics Type in java. Please suggest how can I achieve the same.
Note: This may seem a trivial Generics Problem. But I bet.. it isn't. :)
suppose I have the class declaration as:
public class Abc<T> {
public T getInstanceOfT() {
// I want to create an instance of T and return the same.
}
}
I was implementing the same using the following approach.
I was trying to find a better way to achieve the same.
Isn't it possible?
You don't seem to understand how Generics work. You may want to look at http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html Basically what you could do is something like
You'll have to add exception handling.
You have to pass the actual type at runtime, since it is not part of the byte code after compilation, so there is no way to know it without explicitly providing it.
Type Erasure Workaround
Inspired by @martin's answer, I wrote a helper class that allows me to workaround the type erasure problem. Using this class (and a little ugly trick) I'm able to create a new instance out of a template type:
The ugly trick here is to make the class
abstract
so the user of the class is forced to subtype it. Here I'm subclassing it by appending{}
after the call to the constructor. This defines a new anonymous class and creates an instance of it.Once the generic class is subtyped with concrete template types, I'm able to retrieve the template types.
What you wrote doesn't make any sense, generics in Java are meant to add the functionality of parametric polymorphism to objects.
What does it mean? It means that you want to keep some type variables of your classes undecided, to be able to use your classes with many different types.
But your type variable
T
is an attribute that is resolved at run-time, the Java compiler will compile your class proving type safety without trying to know what kind of object isT
so it's impossible for it to let your use a type variable in a static method. The type is associated to a run-time instance of the object whilepublic void static main(..)
is associated to the class definition and at that scopeT
doesn't mean anything.If you want to use a type variable inside a static method you have to declare the method as generic (this because, as explained type variables of a template class are related to its run-time instance), not the class:
this works, but of course not with
main
method since there's no way to call it in a generic way.EDIT: The problem is that because of type erasure just one generic class is compiled and passed to JVM. Type checker just checks if code is safe, then since it proved it every kind of generic information is discarded.
To instantiate
T
you need to know the type ofT
, but it can be many types at the same time, so one solution with requires just the minimum amount of reflection is to useClass<T>
to instantiate new objects:Of course this implies that the type you want to instantiate:
To operate with different kind of constructors you have to dig deeper into reflection.
The only way to get it to work is to use Reified Generics. And this is not supported in Java (yet? it was planned for Java 7, but has been postponed). In C# for example it is supported assuming that
T
has a default constructor. You can even get the runtime type bytypeof(T)
and get the constructors byType.GetConstructor()
. I don't do C# so the syntax may be invalid, but it roughly look like this:The best "workaround" for this in Java is to pass a
Class<T>
as method argument instead as several answers already pointed out.