> 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.