3 ms·
The point of generics is to pass generic arguments to a method/class, as the name says. In Java you are losing every type information and at runtime your method
by tigershark 10y ago
The point of generics is to pass generic arguments to a method/class, as the name says.
In Java you are losing every type information and at runtime your method will accept objects, not arguments with a generic type.
There are several situation in which preserving the type information is extremely useful.
For this reason in Java you still find a lot of libraries that receive a type as argument, while in C# you can just specify the generic type.
For me it is far more obvious in the c# way given that I cannot see why I should pass the type of an argument in a generic method.
For the streams it is honestly ridiculous.
I want to apply a filter, a map, a reduce or wathever to an Iterable.
The stream is a very well known and completely different concept and it is widely used in reactive programming, they just stole that concept to use it in a completely non obvious way.
For the other streams I still can't see how it is obvious that I should do manually all that wrapping that is completely counterintuitive and makes you lose track of the code purpose.
Finally extension methods are perfectly obvious.
They are just syntactic sugar for static methods, I hope that at least you agree that static method are the gist of obviousness.
- jdmichal 10y agoI've got plenty of dislike for type erasure, and I do agree that it makes the language more complicated. An instance where the Java language was sacrificed to ease virtual machine implementation and backwards compatibility. > The stream is a very well known and completely different concept and it is widely used in reactive programming, they just stole that concept to use it in a completely non obvious way. Java streams seem to meet the ideas of stream processing to me. Given a sequence, apply transformations in order, possibly in a transparently parallel fashion. Compare the Wiki definition with the `BaseStream` interface documentation: https://en.wikipedia.org/wiki/Stream_processing https://en.wikipedia.org/wiki/Stream_processing http://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html http://docs.oracle.com/javase/8/docs/api/java/util/stream/Ba... > Finally extension methods are perfectly obvious. They are just syntactic sugar for static methods, I hope that at least you agree that static method are the gist of obviousness. Yes, I of course agree. My problem is that extension methods hide where they live, by pretending to live on the type. And to be fair, I have the same issue with static imports in Java. When I look at a function or method call, it should be immediately apparent where control flow is going to go. That's not the case with either static imports or extension functions; I have to resolve the method name first.