Since this question is back to four votes to close, I'm trying again to ask a more narrow question that hopefully the community will view more favorably.
Which specific design decisions in Java are documented to be done the way that they are not because that was the preferred design decision, but rather because it was necessary to support backwards compatibility.
The obvious case is Generics, where you cannot detect the type parameter at runtime. (So you can't do:
public void addEmptyMember(List<?> someList) {
if (someList instanceof List<String>) {
((List<String>) someList).add("");
}
}
What other such examples exist in the language design and standard API?