本节主要内容
- JAVA中调用Scala类
- Scala中调用JAVA类
- Scala类型参数与JAVA泛型互操作
- 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