Java generics constraint require default constructor like C#
In C#, I can put a type constraint on a generic parameter that requires the generic type to have a default parameterless constructor. Can I do the same in Java?
In C#:
public static T SomeMethodThatDoesSomeStuff<T>() where T : class, new()
{
// ... method body ...
}
The class and new() constraints mean that T must be a class that can be called with the new operator with zero parameters. What little I know of Java generics, I can use extends
to name a required super class. Can I use that (or any other su开发者_如何转开发pported operation) to achieve the above functionality?
No; in Java the typical solution is to pass a class, and doc the requirement of 0-arg constructor. This is certainly less static checking, but not too huge a problem
/** clazz must have a public default constructor */
public static <T> T f(Class<T> clazz)
return clazz.newInstance();
No.
Because of type erasure, the type of <T>
is not known at runtime, so it's inherently impossible to instantiate it.
Java does not do structural typing, so you cannot constrain T
to have a particular constructor or static
method. Only subtyping and supertyping restrictions are permitted.
So, pass an appropriate abstract factory. Use of reflection here, or in virtually any case, is highly inappropriate. There is now a now a suitable generic JDK type for this in the form of java.util.function.Supplier
.
public static T someMethodThatDoesSomeStuff<T>(
Supplier<T> factory
) {
Invoke as:
Donkey donkey = someMethodThatDoesSomeStuff(BigDonkey::new);
(The method reference needn't be a constructor.)
精彩评论