He got nasty and said - "Look, James Gosling and friends are not bozos, they are not rubes, they know lisp, smalltalk, objective c, C++ and some other languages - why do you suppose they selected the feature set they did for Java?"
I think it's because Oak had a very small implementation budget. It was an experimental set-top box language. From that perspective, Java is a great language design, considered from the perspective of, "How can we get as much benefit from modern language design, given that we have this teeny-tiny budget?" So, look at all the things they did:
-> No first-class functions, because that complicates the type system.
-> No parametric types, because that complicates the type system.
-> No clever object layout strategies.
-> Whenever this caused a potential performance problem, they added a hack to fix just that problem, rather than solving the general problem. For example, consider string concatentation in Java, which implicitly creates StringBuffers, and also think about the primitive type/object distinction.
-> They fixed bad intuitions with runtime checks: for example, Java arrays are covariant, rather than invariant. The unsoundness is fixed with a runtime typecheck on every access, rather than properly engineering the type system.
Java probably does as well as can be expected given the amount of design effort put into it, but there are plenty of much better-engineered languages. (In fact, I'm creating one.)