java\scala,怎么样泛型

java的泛型之-

泛型类:

 


  
public class GenericsFoo<T> {    private T x;    public GenericsFoo(T x) {    this.x = x;    }    public T getX() {    return x;    }    public void setX(T x) {    this.x = x;    }    }   使用=GenericsFoo<String> strFoo=new GenericsFoo<String>("Hello Generics!");  System.out.println("strFoo.getX="+strFoo.getX());

泛型方法:

public <T> void f(T x) {

  System.out.println(x.getClass().getName());   }

调用= ea.f(" ");

 

scala泛型之--

泛型类:

 


  
class Reference[T] {        private var contents: T = _        def set(value: T) { contents = value }        def get: T = contents  } 

Reference类具有一个叫做T的类型参数来表示他说引用的对象的类型。这个类型在Reference中作为了变量和函数的参数或者返回类型。

混入trait的限制

 


  
class EmptySet[A <: Ordered[A]] extends Set[A] {           def contains(x: A) = false           def incl(x: A): Set[A] =            new NonEmptySet(x, new EmptySet[A], new EmptySet[A])      } 

Scala中的array可以取泛型参数(parameterized types)以及类型变量(type variables)来做其元素的类型。这两项在Scala中是可能的,但在Java中是不可能完成的:

 


  
val xs = new Array[List[Int]](leng)    val ys = new Array[T](len)  // 这里的T是类型变量 

要实现array的泛型,必要的步骤就是让array变成非变量(non-variant)。Java无法做到这一点,这是因为其向后兼容的关系。但是,Scala可以做到。

富领域对象:

trait JpaPersistable[T] extends JpaDaoSupport  {
   def getEntity:T;

   def findAll():List[T] = { 
        getJpaTemplate().find("from " + getEntityClass.getName).toList.asInstanceOf[List[T]]   
   }

   def save():T = {
       getJpaTemplate().persist(getEntity)
       getEntity
   }

   def remove() = {
       getJpaTemplate().remove(getEntity);        
   }
      
   def findById(id:Serializable):T = {
        getJpaTemplate().find(getEntityClass, id).asInstanceOf[T];
   }
   //…more code omitted for readability      
}

使用=

class Person extends JpaPersistable[Person] with java.io.Serializable {

  def getEntity = this
  //…more code omitted for readability
}

协变的定义:    

假设有类G(或者接口和特征) 和类型T1,T2  。 在T1是T2的子类的情况下, 如果G<T1> 也是G2<T2>的子类,则类G是协变的。

例子:

 


  
class Link[+T](val head : T, val tail: Link[T]) { def prepend[U >: T](newHead: U): Link[U] = new Link(newHead, this
}    def main(args : Array[String]){        val ln : Link[Integer]=new Link[Integer](1,null)        val lnn : Link[Number]=ln        println(lnn.head)  } 

Integer是Number的子类,Link[Integer]是Link[Number]的子类,这样父类型的Link[Number]也能接受Link[Integer]

 

链接:http://doc.chinaunix.net/web/200912/213587.shtml

转载于:https://my.oschina.net/u/2315939/blog/548099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值