你的问题问得不是很对,主要是英文的表述以及对定义的理解有些问题。
错误对应英文的wrong、mistake,ill-defined对应的是病态定义,错误与病态定义是不一样的。
well-defined与ill-defined并不是正确与错误的。想学明白一样东西需要先搞清定义。
well-defined的意思是大约是每个定义都有唯一的解释。大约应该是这样,水平有限,我给不出精准的定义,还有一些well-founded、well-formed之类的词我都无法给出很好的定义。
而ill-defined的意思应该是一个类型系统中的定义是存在歧义(ambiguity)的。
所以,你应该问java、scala中的subtyping polymorphism是不是ill-defined或存在歧义的?
或者
你应该问的是java、scala引入了subtyping polymorphism的决定是不是一个错误(mistake)?
如果你是第一种问法:
Types and Programming Language一书中给出的Subtype polymorphism并没有任何的歧义,Java与Scala中应该也没有歧义,因为只要编译成功,能输出结果,说明歧义已经消除了,他编译的结果即是对代码的解释,所以Java与Scala是不应该存在歧义的。
如果是第二种问法:
你需要给出什么叫错误的。臃肿是一种错误?丑陋是一种错误?这些都太过主观了。我更倾向于说Java里没有和类型(sum type),接口的实现与类需要强绑定,函数需要借助类来包装等等问题,由于有这些问题导致java很难用,但是"错误"这一词太过强烈了。'Mistake' is a strong word.
多看书,少上知乎。