与Java相比,Scala对泛型和通配符有什么机制?
发布时间:2020-12-15 08:46:49 所属栏目:Java 来源:网络整理
导读:我经常通过使用Guice,TypeLiteral,泛型和通配符来推动 Java类型系统的限制.我经常遇到需要执行未经检查的演员阵容的情况,这几乎破坏了类型安全 – 换句话说,“泛型地狱”. 这是我的一些有问题的Java代码的简化示例. class SquareDrawer implements ShapeDraw
我经常通过使用Guice,TypeLiteral,泛型和通配符来推动
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编写以避免未经检查的强制转换? 在Scala中是否还需要Guice的TypeLiteral? 解决方法
Scala提供了一些东西.
>更高级的kinded类型(我希望我正确使用这个术语)允许你定义诸如“任何类型具有另一种类型作为类型参数”之类的东西afaik没有办法在java中表达> Co和Contravariant类型参数.在java中,您可以通过在使用它们的每个位置使用通配符来创建参数.在Scala中,您只需声明它们即可.>类型见证(再次:这是正确的术语吗?)是隐式函数,它们演示了类型参数的某些属性,从而定义了对类型的约束.如果存在与见证声明匹配的隐式转换,则调用将编译条件成立.>路径依赖类型.您可以拥有作为实例元素的类型,因此每个实例都有自己的类型.再一次,你不能在java afaik中这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |