找回密码
 立即注册
首页 资源区 代码 Scala-泛型

Scala-泛型

骆熙华 4 天前
泛型

泛型定义

Scala的泛型和Java中的泛型表达的含义都是一样的,对处理的数据类型进行约束,但是Scala提供了更加强大的功能

  • scala中的泛型采用中括号
  • scala中的泛型是不可变的
  • 泛型和类型不是一个层面的东西
    所以scala中泛型和类型无法联合使用
泛型语法

如果能将类型和泛型当成一个整体来使用的话,那不就方便了吗?

  • 如果将类型和泛型联合使用,那么类型相同时,如果泛型存在父子类关系,那么联合的类型也就存在父子类关系,这个操作其实就是一种变化,称之为协变, +T
  • 如果类型相同,泛型之间存在父子关系,那么让联合后的类型存在子父关系。这个操作其实也是一种变化,称之为逆变, -T
  1. val message1 : Message[Child] = new Message[Child]()
  2. val message2 : Message[Child] = new Message[Parent]()
  3. //val message3 : Message[Child] = new Message[SubChild]()  -- 不符合新的父子关系
  4. // Child(父) -> child -> SubChild(子)
  5. // MessageChild(子)         MessageSubChild(父)
  6. // Child(子)             Parent(父)
  7. // MessageChild(父)      MessageParent(子)
  8. class Message[-T] {}
  9. class Parent {}
  10. class Child extends Parent {}
  11. class SubChild extends Child {}
复制代码
泛型和类型的区别


  • 所谓的类型,其实就是对外部的数据做约束
  • 所谓的泛型,其实就是对内部的数据做约束
泛型特征

<ul>泛型和类型的层次不一样。不能作为整体来考虑
泛型在某些场合中,其实就是类型参数,用于向类中传递参数
  1.         Test<User> userTest = new Test<User>();
  2.         final User t = userTest.t;
  3.         Test userTest1 = new Test();
  4.         final Object t1 = userTest1.t;
复制代码
泛型其实只在编译时有效, 将这个操作称之为"泛型擦除"
  1.         Test<User> userTest = new Test<User>();
  2.         userTest.t = new Emp();  //--> error
  3.         System.out.println(userTest);
复制代码
泛型主要目的是为了约束内部数据的类型
  1.         List list = new ArrayList();
  2.         list.add(new Emp());
  3.         List<User> userList = list;
  4.         // System.out.println(userList);
  5.         for ( User user : userList ) {}
复制代码
泛型和类型不是一个层次,泛型没有所谓的父子关系
  1. public static void main(String[] args) {
  2.     List<String> stringList = new ArrayList<String>();
  3.     test(stringList); //--> error
  4.     List<Object> stringList1 = new ArrayList<Object>();
  5.     test(stringList1);
  6. }
  7. public static void test( Collection<Object> list ) {
  8.     System.out.println(list);
  9. }
复制代码
泛型的不可变
  1.     public static void main(String[] args) {
  2.         // TODO 6. 泛型的不可变
  3.         List<Child> childList = new ArrayList<Child>(); //--> error
  4.         List<Child> childList1 = new ArrayList<Parent>(); //--> error
  5.         List<Child> childList2 = new ArrayList<SubChild>();
  6.     }
  7.     }
  8.     class Parent {
  9.     }
  10.     class Child extends Parent {
  11.     }
  12.     class SubChild extends Child {
  13.     }
复制代码
为了使用方便,可以定义泛型的边界
[code]public static void main(String[] args) {    Producer p = new Producer();        p.produce(new Message());    p.produce(new Message());    p.produce(new Message());  //--> error    Consumer c = new Consumer();    final Message
您需要登录后才可以回帖 登录 | 立即注册