As exceções verificadas em Java não são uma coisa tão ruim. É claro que os ADTs podem ser a melhor opção para o Scala, mas em Java, as exceções marcadas têm seu lugar e o argumento do código arrumado é apenas sem noção, não importa, quantos blogs o repetiram. Basicamente, diz que você deve ignorar com prazer condições severas e possivelmente reparáveis que podem ocorrer em seu sistema, porque o sistema de tipo parafuso, um código bonito , torna seu sistema robusto automaticamente. Tal raciocínio também explica por que tantos programadores Java mover voluntariamente o seu código em XMLs (Spring, Maven, etc. eu perca a muito papel aqui embora).
O motivo da falta de exceções verificadas em Scala, fornecido por M. Odersky abaixo de http://www.scala-lang.org/old/node/8787.html, é surpreendentemente diferente e faz sentido.
O problema com exceções verificadas é melhor demonstrado pelo método map nas listas:
def map[B](f: A => B): List[B]
Como fazer anotações no mapa com @throws? Se o mapa não receber uma anotação @throws em si, presumivelmente você não poderá passar nenhuma função que possua @throws. Isso introduziria restrições e distinções complicadas para as maneiras pelas quais o mapa pode ser usado. As coisas seriam melhores se pudéssemos declarar de alguma maneira que o mapa lança todas as exceções que seu argumento de função lança. Existem alguns sistemas de efeito que podem expressar isso, mas até agora todas as notações que vi são muito pesadas.
Lukas Rytz está pesquisando sistemas de efeitos leves que podem ser usados para expressar o tipo de mapa e outras funções comuns de maneira concisa e precisa. É pesquisa, por isso, atualmente, não está claro até que ponto teremos sucesso e quanto disso poderá ser colocado no Scala. Idealmente, poderemos adicioná-lo em algum momento como um sistema de tipos opcional. Mas é muito cedo para fazer previsões concretas.
Felicidades
Não tenho certeza, mas acho que as lambdas do Java 8 também estão restritas a exceções não verificadas.Os métodos na maioria das (todas?) Novas interfaces funcionais no JDK 8 ( java.util.function.*
) também não declaram exceções não verificadas.