> On Thu, 2008-10-16 at 15:02 +1300, Richard O'Keefe > wrote: > > On 16 Oct 2008, at 12:09 pm, Jonathan Cast wrote: > > >> I am not sure how say in a Java language a > constructor can "conjure > > >> up > > >> a value of an unknown type". > > > > > > Well, that's the point. It can't, in > Haskell or in Java. If you > > > understand that --- that you can't call the > default constructor of a > > > class that is not statically known at compile > time > > > > If you understand that about Java, then you don't > understand Java. > > God, I hope never to understand Java. *shudder* > > > Java reflection means that compile-time types are > backed up by > > runtime objects belonging to Type in general, to Class > if they > > are class types. It also means that you can discover > the > > default constructor by using aClass.getConstructor(), > and you > > can invoke it by using .newInstance(). > > Wait, what? Why can't Java use this to keep template > parameters around > at run time? Or is the article (as per which > Set<Integer> and > Set<Double> are identical at run time) full of it? >
The article (whichever it was) wasn't full of it... Set<Integer> and Set<Double> are identical at runtime. You cannot, given a Class object at runtime that happens to be the Class object corresponding to Set<?>, conjure up an instance of Set... but simply for the reason that Set has no constructors (it is an interface). You can, however, given a class object that happens to be the class object corresponding to (say) HashSet, conjure up an instance of a HashSet, and assign it to a variable of the (static) type Set<Integer> or Set<Double>... i.e. Set<Integer> foo = (Set<Integer>) hashSetClass.newInstance(); Set<Double> bar = (Set<Double>) hashSetClass.newInstance(); which will generate warnings about unsafe casts, but nevertheless can compile, and won't cause any exceptions at runtime. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe