加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

与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中这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读