scala 泛型上下限、协变、逆变

首先说明,我是学java的,暂时现在java还是我的本命语言,也就说,对java语法滚瓜烂熟,其他语言语法就随便用用,细节没记。所以,学习scala时都是用于转换成java的思维去理解(scala代码转class字节码再转java代码,一样能走通不是么,了解底层,就不用想太多了,节省时间)

 

重点来了,这里记录一下学习scala泛型相关的东西。。就是与java泛型的做个对比。。

一、上下限。

java是使用extends与super。

而scala是使用<:与>:

功能是一模一样的。(所以这两门jvm语言为什么关键字不同一一下?)

那我就不多讲了。

二、scala协变、逆变与java的通配符+extends、super

scala协变与逆变是在类型定义泛型的时候指定。。分别是协变是在泛型参数前用+,逆变在泛型参数前用-号。

java的不详细描述。

首先看scala的逆变与协变代码:

object Test {
    def main(args: Array[String]): Unit = {
        var t1:Test1[Father] = new Test1[Son]
        var t2:FatherTest[Father] = new Test1[Son]  //java无法做到
        var t3:Test2[Father] = new Test2[GrandFather]
    }
}
class Son extends Father {}
class Father extends GrandFather {}
class GrandFather{}

class FatherTest[+T]{}
//协变
class Test1[+T] extends FatherTest {}
//逆变
class Test2[-T]{}

再看看java的代码:

public class Main  {
    public static void main(String[] args) {
        Test1<? extends Father> t1 = new Test1<Son>();
        //java不能做到下面一行,scala可以
        //TestFather<? extends Father> t2 = new Test1<Son>();
        Test2<? super Father> t3 = new Test2<GrandFather>();
    }
}

class Son extends Father { }
class Father extends GrandFather { }
class GrandFather{ }

class TestFather<T>{}
class Test1<T> extends FatherTest<T> {}
class Test2<T>{}

 

其实两者意思差不多。。

区别在于scala协变与逆变是写在类型定义的时候。。java的则在代码赋值时才用通配符。

但他们都是为了在赋值时可以让同一变量接收不同泛型。

只不过,scala可以类型不同、泛型也不同,但都必须由继承关系才行。而java则类型必须相同,泛型可以不同,只需泛型有继承关系即可。

总的来说,scala的范围更大一些,java范围小一些。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值