Scala入门到精通——第二十八节 Scala与JAVA互操作

本文详细介绍了Scala与Java的互操作,包括JAVA中调用Scala类,Scala中调用JAVA类,Scala类型参数与JAVA泛型互操作,以及Scala与Java间的异常处理互操作。在JAVA中调用Scala类时,若trait包含具体成员,需特殊处理。Scala可以直接调用Java类并利用隐式转换使用高阶函数。两者之间的泛型互操作直接转换即可。异常处理方面,Scala使用模式匹配,Java则采用传统try-catch。掌握这些内容能有效应对多数互操作场景。
摘要由CSDN通过智能技术生成

本节主要内容

  1. JAVA中调用Scala类
  2. Scala中调用JAVA类
  3. Scala类型参数与JAVA泛型互操作
  4. Scala与Java间的异常处理互操作

1. JAVA中调用Scala类

Java可以直接操作纵Scala类,如同Scala直接使用Java中的类一样,例如:

//在Person.scala文件中定义Scala语法的Person类
package cn.scala.xtwy.scalaToJava
class Person(val name:String,val age:Int)
//伴生对象
object Person{
  def getIdentityNo()= {
  "test"}
}
//ScalaInJava.java文件中定义了ScalaInJava类
//直接调用Scala中的Person类
package cn.scala.xtwy.scalaToJava;

public class ScalaInJava {
    public static void main(String[] args) {
       Person p=new Person("摇摆少年梦", 27);
       System.out.println("name="+p.name()+" age="+p.age());
       //伴生对象的方法当做静态方法来使用
       System.out.println(Person.getIdentityNo());
    }
}

对!就是这么简单,Java似乎可以无缝操纵Scala语言中定义的类,在trait那一节中我们提到,如果trait中全部是抽象成员,则它与java中的interface是等同的,这时候java可以把它当作接口来使用,但如果trait中定义了具体成员,则它有着自己的内部实现,此时在java中使用的时候需要作相应的调整。我们先看下trait中全部是抽象成员的情况,例如:

//全部是抽象成员,与java的interface等同
trait MySQLDAO{
  def delete(id:String):Boolean
  def add(o:Any):Boolean
  def update(o:Any):Int
  def query(id:String):List[Any]
}
//MySQLDAO字节码反编译后的结果
D:\ScalaWorkspace\ScalaChapter28\bin\cn\scala\xtwy\scalaToJava>javap MySQLDAO.cl
ass
Compiled from "MySQLDAO.scala"
public interface cn.scala.xtwy.scalaToJava.MySQLDAO {
   
  public abstract boolean delete(java.lang.String);
  public abstract boolean add(java.lang.Object);
  public abstract int update(java.lang.Object);
  public abstract scala.collection.immutable.List<java.lang.Object> query(java.l
ang.String);
}

//java直接implement,与普通的java接口一样
public class MySQLDAOImpl implements MySQLDAO{
   

    @Override
    public boolean delete(String id) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean add(Object o) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int update(Object o) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public List<Object> query(String id) {
        // TODO Auto-generated method stub
        return null;
    }

}

那如果Trait中包括了具体的成员,此时又该怎么使用呢?此时需要作特殊处理,代码如下:

/**
  * Created by 摇摆少年梦 on 2015/8/16.
  */
trait MySQLDAO {
   //具体方法
   def delete(id:String):Boolean={ true}
   def add(o:Any):Boolean
   def update(o:Any):Int
   def query(id:String):List[Any]
 }


//JAVA语言实现带有具体成员方法的MySQLDAO 
/**
 * Created by 摇摆少年梦 on 2015/8/16.
 */
public class MySQLDAOImpl implements MySQLDAO {
   
    @Override
    public boolean delete(String id) {
        //调用生成带有具体delete方法实现的MySQLDAO$class
        if (MySQLDAO$class.delete(this, id)) return true;
        else return false;
    }

    @Override
    public boolean add(Object o) {
        return false;
    }

    @Override
    public int update(Object o) {
        return 0;
    }

    @Override
    public Li
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值