我想通过与Haskell的newtype比较,我理解了Scala 2.10的新“值类”功能:

trait BoundedValue[+This] extends Any { this: This =>

def upperBound: This

def lowerBound: This

}

class Probability @throws(classOf[IllegalArgumentException]) (v: Double) extends AnyVal with BoundedValue[Probability] {

val value: Double = if ((v >= 0.0) && (v <= 1.0)) v else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")

override val upperBound: Probability = new Probability(0.0)

override val lowerBound: Probability = new Probability(1.0)

// Implement probability arithmetic here;

// will be represented by Double at runtime.

}我的问题是,对于使用声明它的Scala包的Java代码,值类如何显示?值类是从Java方面作为引用类出现的,还是被完全擦除(并因此显示为它所包装的类型)?换句话说,当Java在源代码级别上涉及时,类型安全是否是值类?

编辑

根据SIP-15文档(在Daniel的回答中链接),上面的代码不会被编译,因为值类不允许有任何初始化逻辑,因为v必须显式为val,或者Probability必须有unbox方法以及对应的box方法,因为值类必须只有一个字段。正确的代码是:

trait BoundedValue[This <: boundedvalue extends any this: this="">

def upperBound: This

def lowerBound: This

}

class Probability private[Probability] (value: Double) extends AnyVal with BoundedValue[Probability] {

@inline override def upperBound: Probability = new Probability(0.0)

@inline override def lowerBound: Probability = new Probability(1.0)

@inline def unbox: Double = value

// Implement probability arithmetic here;

// will be represented by Double at runtime (mostly).

}

object Probability {

@throws(classOf[IllegalArgumentException])

def box(v: Double): Probability = if ((v >= 0.0) && (v <= 1.0)) new Probability(v) else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")

}然而,问题本身仍然有效。

java定义用户类_用户定义的值类在Java中看起来像什么?相关推荐

  1. java友元类_友元实例:友元类及友元函数

    学习了c++这么久,一直没有对友元进行了解,据说友元不是特别好用(据说,不是我说的),因此直到今天才去了解.其实友元确实不是很常用,但友元功能确实很实用,它不但能够释放类中的非公有成员,同时还能保证了 ...

  2. java comparator接口类_常见的接口与类 -- Comparator

    接口Comparator 1.1 前面我们讲过Java提供了一个用于比较的接口Comparable,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法.实际上Java中除了比较一个接口 ...

  3. java 元类_[译]什么是元类metaclass?

    类即对象 在理解元类之前,需要先掌握Python中的类,Python中类的概念与SmallTalk中类的概念相似. 在大多数语言中,类是用来描述如何创建对象的代码段,这在Python中也是成立的: & ...

  4. 安卓应用用户数据_用户指标数据应用

    一.如何理解数据 用户数据:gender:性别. birthday:出生日期 行为数据:user_id:用户id.auction_id:购买行为编号.buy_mount:购买数量.day:购买时间 商 ...

  5. python映射实体类_将Python(django)实体类转换为Java的好方法 - java

    我正在寻找一种"复制" /将模型从Python源代码转换为Java源代码的好方法.我的想法是在服务器上使用Python django框架生成实体模型类.另一方面,我想将实体类转换为 ...

  6. 在python中怎么定义一个范围_如何定义范围

    展开全部 范围定义62616964757a686964616fe4b893e5b19e31333363386662 范围定义(Scope Definition) 目录 [隐藏] 1 什么是范围定义 2 ...

  7. java byte 判断相等_转发收藏 | 史上最全Java面试题+面试网站推荐!(含答案)

    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次.对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦. 相关概念 面向对象的三个 ...

  8. 百度java的线程技术_自我提升(基础技术篇)——java线程简介

    前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资料,理解那些大神和官方的资料,写这么一篇关于线程的文章 本来想废话一番,讲讲自己的经历 ...

  9. 用java编写验证码程序_编写,验证和分析实时Java应用程序

    本文是" 用实时Java开发"系列的第三篇也是最后一部分,展示了如何设计,编写,验证和分析基本的实时应用程序. 我们将说明: 应用程序的时间和性能要求. 为什么传统的非实时Java ...

  10. java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理

    原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...

最新文章

  1. 深度学习——你需要了解的八大开源框架
  2. 如何处理网络丢包故障?—Vecloud微云
  3. common-collections中Java反序列化漏洞导致的RCE原理分析
  4. 前端学习(3223):总结props
  5. codeigniter view 试图里再引入view视图
  6. Java 代码性能优化总结
  7. 就数据平台建设,80%的500强企业都有一个共性
  8. sql server 用户'sa'登录失败(错误18456)(转载)
  9. IPQ4019/QCA9531/MT7628/MT7621系嵌入式无线双频AP核心模块选型探讨
  10. Hello CSND
  11. ce修改手游服务器的数据,CE修改器修改游戏数据的方法
  12. 中国天气网-天气预报接口api
  13. 视频录制后有噪音怎么办?教你简答几步去除视频噪音!
  14. 制定自己的工作目标时,应该学会SMART法则
  15. symbian学习笔记
  16. 电脑触摸屏无法使用、失灵解决办法
  17. matlab电机系统建模与仿真软件下载,基于MATLAB直流无刷电动机系统建模与仿真
  18. 使用网络摄像头进行眼睛注视估计
  19. 步进电机c语言驱动原理,《步进电机【驱动电路+C语言驱动程序】》.doc
  20. 我的世界服务器自定义ui,自定义主菜单CustomMainMenu mod教程

热门文章

  1. 下载Visual Studio 2008 Beta 2
  2. java内置的四大函数式接口
  3. ui-sref与$state.go()的使用
  4. JDBC批处理---(java 对数据库的回滚) .
  5. Linux下如何阅读开源项目
  6. Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法
  7. 你的第一个 iOS 应用程序: 100% 的编程方式
  8. javascript中Math.round获取小数点位数
  9. html在线快递单号打印,HTML 快递打印模板
  10. 拓端tecdat|Python中的Apriori关联算法-市场购物篮分析