Ответ 1
Это потому, что Any
на самом деле просто Object
. Имея Double
, есть удобная фикция - она фактически java.lang.Double
, которая автоматически выдается вам в матче. К сожалению, для Scala нет способа определить, найдет ли он java.lang.Double
, если он предполагается интерпретировать как Double
или как java.lang.Double
- в последнем случае AnyRef
должен поймать Это. Так оно и есть. Но если вы специально спросите Double
, он знает, что он должен распаковываться, а затем не нужно проверять случай AnyRef
. (И, на самом деле, если вы намеревались быть java.lang.Double
, он тоже будет отключен), это не может отличить.)
Является ли это идеальное поведение дискуссионным, но это логично.