In my (limited) experience, nobody at a university has any clue as to what OOP really is about. In one "advanced" Java class, the professor once said that he had never been able to find a purpose for inheritance and that it would be best not to use it
Wow. And one of the stated reasons for going with Java is that the students come out of college already knowing it. Hmmm. Based on this, there's a reason for not using Java. And this is consistent with my interactions with Java people who did not start out in Smalltalk - there is very, very little understanding of OO principles. Not that inheritance can't be done badly; it quite often is, and deep inheritance trees are typically a danger sign. But look at that comment above - no discussion of pros/cons, no explanation as to why using composition is often better (see class List in VisualWorks, for instance) - just a flat No.
Take a look at this comment further down in the Lambda thread
I was about to make a snide comment along the lines of "How would you write a GUI toolkit in Java without using inheritance? Without subclassing you would need to add a hook interface for every imaginable behaviour of every component!"
Then I started to remember how Swing is written :-)
Later on in the thread we find this piece of brilliance:
Inheritance is the key to separation of interface and implementation, and hence polymorphism, in a statically typed OO language. This is perhaps the primary facet which separates languages like Java from "object-based" languages like VB.
Frankly, I don't know how projects of any significant size are accomplished using dynamically-typed languages, with their lack of interface inheritance
Translation: I've never worked in a dynamic language, so it can't possibly work. You have to love these people. This seems to be the pattern of learning going on in Java and C# - We know nothing about these other technologies, so they must be bad. Richard Gabriel had it about right in Worse is Better.
The more things change....