经常在写Rdd的时候, 如:  val OWNER_ID=row.getAs("OWNER_ID")  等,

运行是可能会报异常 : java.lang.String cannot be cast to scala.runtime.Nothing

后检查后发现,其实应该保证类型一致,应该写成: val OWNER_ID=row.getAs[String]("OWNER_ID")

那么,问题来了, 为啥会有上面的异常出现。查询结果,觉得这篇文章有点意思,就摘抄过来了,

已做为学习,若侵犯您的版权,请在下评论@dy9776 , 我会尽快处理删除掉。

摘抄如下:

    1. Nothing是什么

      Nothing是一个类型(type)。就像Int、String一样是一个类型,比如值3是Int型的,值"abc"是String型的,与Int、String不同的是,不存在Nothing类型的值。

      Nothing这个类型(Type)还有个特点,他是Bottom Type,所谓Bottom type就是他是所有其他类型的子类型(Sub Type) (The bottom type is a subtype of all types.)。 所以可以认为Nothing是Int的子类型,Nothing也是String的子类型。下面摘自Scala Reference 3.5.2 Conformance

      For every value type T , scala.Nothing <: T <: scala.Any
      For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any

    2. Nothing意义何在
      1. 意义之一:用于类型参数(covariant parameterized types)。
        首先,Scala的泛型是不允许不加类型参数的。 以下摘自Programming In Scala, 2nd Edition, Chapter 19 Type Parameterization

        Unlike Java, which allows raw types, Scala requires that you specify type parameters.
        (不像Java那样允许raw type,Scala必须指定类型参数)

        所以以下两行会出错:Error: type List takes type parameters

        type myList = List
        val li: List = List(1)

        改写成如下可以通过编译:

        type myList = List[String]
        val li: List[Int] = List(1)

        因为List(1)有一个Int型的元素:1,所以他的类型是List[Int]。嗯,make sense,一个List的类型取决于这个List里面的元素。所以List(“abc”)那么就是List[String]型,List(“abc”, 1)就是List[Any],因为"abc"和1都是Any型的子类型。类型推导就是这么工作的。

        那么List()呢?一个空的List,他是什么类型呢?肯定不是List[Int],因为里面并没有Int,也不是List[Any],因为里面啥都没有,没有理由推导出任何一个其他类型,于是这个List()只能是List[Nothing]。

        scala> val l = List()
        l: List[Nothing] = List()

        Nil就是继承自List[Nothing]的。所以才可以做1 :: Nil和"abc” :: Nil。也正因为Nil是List[Nothing],Nothing是bottome type,List是协变的,所以1 :: Nill才会被推导成List[Int],“abc” :: Nil会被推导成List[String]

        case object Nil extends List[Nothing] {
        override def isEmpty = true
        def head: Nothing =
        throw new NoSuchElementException("head of empty list")
        def tail: List[Nothing] =
        throw new NoSuchElementException("tail of empty list")
        }

        小实验,下面可以编译执行吗?ml1的类型是什么呢?

        val ml: List[String] = List()
        val ml1 = 2 :: ml

        意义之二,代表非正常退出。比如抛异常。这个也很make sense,异常嘛,肯定啥都返回不了,类型只有是Nothing了。

        scala> def e = throw new Exception("s")
        e: Nothing

        上文中的Nil的head方法也是一个例子。这里也体现了Nothing的Bottom Type的好处。

        scala> def er(p: Boolean) = if(p) 1 else throw new Exception("yeah")
        er: (p: Boolean)Int

        类型推导观察了下程序,发现这个er方法有2种可能的返回类型,一种是Int,一种是Nothing。由于Nothing是Bottom Type,所以Nothing是Int的子类,所以认为这2种可能返回的类型都是Int,所以推导出er方法的返回值是Int。

      说了这么多,Doc上就几句话:

      Nothing is - together with scala.Null - at the bottom of Scala's type hierarchy.

      Nothing is a subtype of every other type (including scala.Null); there exist no instances of this type. Although type Nothing is uninhabited, it is nevertheless useful in several ways. For instance, the Scala library defines a value scala.collection.immutable.Nil of type List[Nothing]. Because lists are covariant in Scala, this makes scala.collection.immutable.Nil an instance of List[T], for any element of type T.

      Another usage for Nothing is the return type for methods which never return normally. One example is method error in scala.sys, which always throws an exception.

      总结,Nothing是一个Bottom类型,不存在任何值属于Nothing类型。主要有2个用处,用于类型参数和代表非正常退出。

      参考资料:
      1: http://en.wikipedia.org/wiki/Bottom_type
      2: http://www.scala-lang.org/docu/files/ScalaReference.pdf
      3: http://www.scala-lang.org/api/2.10.4/index.html#scala.Nothing
      4: Programming In Scala, 2nd Edition

看完后,有点小明白了!

java.lang.String cannot be cast to scala.runtime.Nothing Scala中的Nothing类型的更多相关文章

  1. 记录maven java.lang.String cannot be cast to XX error

    在项目开发中自定义了一个maven plugin,在本地能够很好的工作,但是在ci server上却无法正常工作报错为: --------------------------------------- ...

  2. java.lang.ClassCastException: java.lang.String cannot be cast to com.jy.hfims.domain 映射实体类型错误

    今天在做 excel导出的时候,出现了一个问题"java.lang.ClassCastException: java.lang.String cannot be cast to com.do ...

  3. 解决jeesite开发java.lang.String cannot be cast to com.thinkgem.jeesite.modules.sys.security.SystemAuthorizingRealm$Principal问题

    解决jeesite问题java.lang.String cannot be cast to SystemAuthorizingRealm问题 这些天在jeesite项目上进行二次开发,遇到许多莫名其妙 ...

  4. Cause: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.ibatis.mapping.MappedStatement

    我用的是pagehelper 4.2.0,利用其进行表单的分页处理并进行展示,在第一次执行的时候能够看到分页后的结果,刷新一下第二次就显示不出来,控制台出现: Cause: java.lang.Cla ...

  5. ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]

    错误堆栈: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[] at android ...

  6. java.lang.String cannot be cast to java.util.Date

    我这个是个新建的功能,然后在保存的时候出现了这个错误.然后就找到了新建的action,发现其上的list方法出了问题. 这样是正确的.之前list<Constract>写成这样了.

  7. 【Java面试题】53 能不能自己写个类,也叫java.lang.String?

    可以,但是即使你写了这个类,也没有用. 这个问题涉及到加载器的委托机制,在类加载器的结构图(在下面)中,BootStrap是顶层父类,ExtClassLoader是BootStrap类的子类,ExtC ...

  8. 能不能自己写个类,也叫java.lang.String?

    可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String.由于在tomcat的web应用程序中,都是由webapp自 ...

  9. [Scala] java使用scala的jar包问题:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short

    场景 刚写的scala处理bmp文件的实验, 打了jar包让java调用一下, 结果发生这个错误. package org.tanglizi.bmp.demo; import org.tanglizi ...

随机推荐

  1. django数据模型中 null=True 和 blank=True 有什么区别?

    null 如果为 True , Django 在数据库中会将空值(empty)存储为 NULL .默认为 False . blank 设置字段是否可以为空,默认为False(不允许为空) 和null的 ...

  2. 我一直跑的分类LSTM模型原来是这一个,新闻分类网络

    原始的github可以参考这里: https://github.com/FudanNLP/nlpcc2017_news_headline_categorization 我的经验文章可以参考这里: ht ...

  3. 【BLE】CC2541之发现服务与特征值

    一.简介 本文以SimpleBLECentral工程为例,解析CC2541作为主机时是如何发现从机的服务和特征值的. 二.实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件:IAR 8. ...

  4. [PowerShell Utils] Create a list of virtual machines based on configuration read from a CSV file in Hyper-V

    Hello everyone, this is the third post of the series. .   Background =============== In my solution, ...

  5. Openfire XMPP Smack RTC IM 即时通讯 聊天 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. AOP AspectJ 字节码 语法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. 10 个非常有用的 SVG 动画的 JavaScript 库

    SVG 通常可以用作跨分辨率视频.这意味着在一块高分屏幕上不会降低图片的锐度.此外,你甚至可以让SVG动起来,通过使用一些javascript类库.下面,我们分享一些javascript类库,这些类库 ...

  8. Python3 使用 matplotlib 画折线图

    ChartUtil.py import matplotlib.pyplot as plt from pylab import mpl def plotLine(xData,yData,xLabel,c ...

  9. Ubuntu14设置静态IP的地方

    sudo vim /etc/network/interfaces 修改如下部分: auto eth0iface eth0 inet staticaddress 192.168.0.117gateway ...

  10. java实现文件的断点续传的下载

    java的断点续传是基于之前java文件下载基础上的功能拓展 首先设置一个以线程ID为名的下载进度文件, 每一次下载的进度会保存在这个文件中,下一次下载的时候,会根据进度文件里面的内容来判断下载的进度 ...