Я часто нажимаю пределы системы типа Java через мое использование Guice, TypeLiteral
, дженериков и подстановочных знаков. Я часто сталкиваюсь с ситуациями, когда мне нужно выполнять непроверенные броски, что в значительной степени разрушает безопасность типов - другими словами, «Древовидный ад».Какие механизмы имеет Scala для дженериков и подстановочных знаков по сравнению с Java?
Вот упрощенный пример некоторых проблемных 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, чтобы избежать непроверенных бросков?
Есть еще необходимость в Guice's TypeLiteral
в Scala?
За исключением того, что Манифесты не являются овериями. Они просто сообщают компилятору, что ему не нужно жаловаться на некоторые виды использования дженериков (например, динамически их создавать), показывая компилятору все разные пути кода, которые действительно могут быть приняты в рамках проявленного общего. – Destin
@Destin: Не совсем ... – soc
@soc http://stackoverflow.com/questions/3587286/how-does-scalas-2-8-manifest-work – Destin