News for hackers. Stuff that matters.
Re:Java Generics Are Turing Complete by kmiroslav on Thursday May 26, 2016 @03:15PM (#11780692)
Pass a factory `createT()` instead, problem solved.
Re:Java Generics Are Turing Complete by adevine on Thursday May 26, 2016 @03:40PM (#11780866)
Exactly - except it's gross and results in a lot of annoying boilerplate code for what should be considered a simple operation.

Tons of generic APIs essentially do the same thing by passing in the class object in the constructor, e.g. http://stackoverflow.com/a/1090488/1075909 . The question for people not that familiar with the Java type system is often "Why do I have to pass in the class object when I just declared the type parameter in my instance?"

That's not the only thing you need to workaround because of type erasure (the "TypeToken" stuff in a lot of deserialization libraries is another one that comes to mind frequently), but it's probably the first annoying example people hit.

Re:Java Generics Are Turing Complete by kmiroslav on Friday May 27, 2016 @10:17AM (#11786187)
Erasure is not the problem here, you need to be able to specify a type constraint that will allow you to invoke T(). What if T is an interface? An abstract class? A class with no default constructor?

The only reasonable way to do this is to accept a lambda that tells the compiler exactly what call is legal to create an instance of T.

And that's called a factory.

Re:Java Generics Are Turing Complete by adevine on Friday May 27, 2016 @05:39PM (#11789235)
Yes, good point. But if you did have a type constraint, like C#, you would still need the runtime type info to know what to create. This is legal in C#:

public static T Factory<T>() where T:new() { return new T(); }