basically forcing me to write the code that the compiler generates for me when i use an anonymous class.

Yes, and I'm OK with that :)

You could look at the glass as 90% full (after all, you can still do what you want to do), or 10% empty (you had to be more explicit about it.)  I think its more like 90% full.

And "explicit" is the name of the game here.  If I asked 1000 Java users what would go wrong if there were non-denotable subtypes, how many of them do you think would immediately say "That would be bad for my clients, because I'm depriving them of exhaustive decomposition?"  Any?  I doubt it.  Which means a lot of people will make the mistake of doing so without even realizing what they're doing.  By being explicit about what the subtypes are, it is harder to make this mistake.  That seems a reasonable tradeoff for the increased type checking.

This "hosing the clients without realizing it" is a lot like this one:

https://stackoverflow.com/questions/23453287/why-is-final-not-allowed-in-java-8-interface-methods/23476994#23476994

People wrote angry blogs about how broken Java 8 interface methods were because they didn't support all the modifiers that class methods did.  They would self-righteously claim "If I make a method final, you should assume I have a damn good reason, and not second-guess me."  It did not occur to one person that, if you give people the ability to make interface methods final, you might put your clients in a terrible (possibly impossible) situation.  When people are writing APIs, they rarely think enough about how this interacts with other APIs, or client code; they're focused through the lens of their own API.  Supporting anonymous or lambda subtypes makes it way too easy to forget that you're taking something important away from your clients.

Now, you might think this feature is 95% about subclass control and 5% about exhaustive decomposition, and so this seems like the tail wagging the dog to you.  But it's an opportunity for use to do better type checking -- which makes programs more reliable -- and I don't want to give that up so easily.

(And, if we're wrong now, we can always relax this later, once people are more educated about exhaustiveness.  Not so much in the other direction.)


Reply via email to