Я часто раздвигаю границы системы типов Java, используя Guice, TypeLiteral
, дженерики и шаблоны.Я часто сталкиваюсь с ситуациями, когда мне нужно выполнить непроверенные приведения, что в значительной степени нарушает безопасность типов - другими словами, «Generics Hell».
Вот упрощенный пример некоторых моих проблемных кодов Java.
class SquareDrawer implements ShapeDrawer<Row<Square>> {}
class Client {
Key<SquareDrawer> SQUARE_DRAWER_KEY =
Key.get(SquareDrawer.class, randomAnnotation());
void bindShapeDrawer(
Key<? extends ShapeDrawer<Row<? extends Shape>>> shapeDrawer) {}
Client() {
// Note Unchecked cast required below
bindShapeDrawer(
(Key<? extends ShapeDrawer<Row<? extends Shape>>>) SQUARE_DRAWER_KEY);
}
}
Я изучал Scala и у меня сложилось впечатление (или иллюзия), что он лучше поддерживает дженерики, чем Java.Может ли приведенный выше код быть написан на Scala, чтобы избежать непроверенных приведений?
По-прежнему ли нужна TypeLiteral
Guice в Scala?