> Java has no type inference, higher order functions,
> coroutines, implicits (it has some standard implicit
> conversions but not implicit conversions that can be
> added by the user) and no Turing complete type system.
Type inference in Java: int bar = new Object(){ int foo = 42; }.foo;
// Magic? No. Type inference.
Higher order functions in Java: http://download.java.net/jdk8/docs/api/java/util/stream/Stream.html
Looks pretty higher-order to me.
Also possible in older version in Java with stuff like Google Guava or FJ.
Coroutines in Java: http://stackoverflow.com/questions/2846428/available-coroutine-libraries-in-java
Implicits: Having them built into the language is even worse.
In Scala you could just de-import them and have them gone.
Anyway, pick C# as an example instead if you want to have
user-defined implicit conversions.
No Turing complete type system: interface Interface<T> {}
class Bang<T> implements Interface<Interface<? super Bang<Bang<T>>>> {
static void bang() {
Interface<? super Bang<Byte>> bang = new Bang<Byte>();
}
}
Looks pretty undecidable to me. In a way, it is even
worse than other languages: You are unable to tell
whether the type checker will terminate in finite time
(like some other languages), but don't get any additional
expressivness in return (unlike those other languages).
> As a side effect this will also find all type errors
> a compiler will find.
No, absolutely not. > I have programmed a lot in Java and also in dynamic
> programming languages and in my opinion type errors
> just don't happen often enough to justify the
> additional amount of work and complexity that comes
> with static type systems.
This comment certainly explains a lot. You are suffering from the "I used Java and Java is statically typed and it sucks, therefore all statically typed languages have to suck" fallacy. |
If I have a function: def upcase(s: String): String... The compiler with its static type system can tell me if e. g. I am trying to call the upcase function with an Int argument. But in my experience something like that just does not happen very often. Most programmers are not so stupid that they try to fit a square peg in a round hole. ;-)
A unit test can check if the returned string is really the upcase version of the input parameter. Plus if the programmer would really assume that he could upcase an Int it would just as well give the feedback that his assumption was wrong-like the compiler.