Scala-泛型
泛型泛型定义
Scala的泛型和Java中的泛型表达的含义都是一样的,对处理的数据类型进行约束,但是Scala提供了更加强大的功能
[*]scala中的泛型采用中括号
[*]scala中的泛型是不可变的
[*]泛型和类型不是一个层面的东西
所以scala中泛型和类型无法联合使用
泛型语法
如果能将类型和泛型当成一个整体来使用的话,那不就方便了吗?
[*]如果将类型和泛型联合使用,那么类型相同时,如果泛型存在父子类关系,那么联合的类型也就存在父子类关系,这个操作其实就是一种变化,称之为协变, +T
[*]如果类型相同,泛型之间存在父子关系,那么让联合后的类型存在子父关系。这个操作其实也是一种变化,称之为逆变, -T
val message1 : Message = new Message()
val message2 : Message = new Message()
//val message3 : Message = new Message()-- 不符合新的父子关系
// Child(父) -> child -> SubChild(子)
// MessageChild(子) MessageSubChild(父)
// Child(子) Parent(父)
// MessageChild(父) MessageParent(子)
class Message[-T] {}
class Parent {}
class Child extends Parent {}
class SubChild extends Child {}泛型和类型的区别
[*]所谓的类型,其实就是对外部的数据做约束
[*]所谓的泛型,其实就是对内部的数据做约束
泛型特征
<ul>泛型和类型的层次不一样。不能作为整体来考虑
泛型在某些场合中,其实就是类型参数,用于向类中传递参数
Test<User> userTest = new Test<User>();
final User t = userTest.t;
Test userTest1 = new Test();
final Object t1 = userTest1.t;泛型其实只在编译时有效, 将这个操作称之为"泛型擦除"
Test<User> userTest = new Test<User>();
userTest.t = new Emp();//--> error
System.out.println(userTest);泛型主要目的是为了约束内部数据的类型
List list = new ArrayList();
list.add(new Emp());
List<User> userList = list;
// System.out.println(userList);
for ( User user : userList ) {}泛型和类型不是一个层次,泛型没有所谓的父子关系
public static void main(String[] args) {
List<String> stringList = new ArrayList<String>();
test(stringList); //--> error
List<Object> stringList1 = new ArrayList<Object>();
test(stringList1);
}
public static void test( Collection<Object> list ) {
System.out.println(list);
}泛型的不可变
public static void main(String[] args) {
// TODO 6. 泛型的不可变
List<Child> childList = new ArrayList<Child>(); //--> error
List<Child> childList1 = new ArrayList<Parent>(); //--> error
List<Child> childList2 = new ArrayList<SubChild>();
}
}
class Parent {
}
class Child extends Parent {
}
class SubChild extends Child {
}为了使用方便,可以定义泛型的边界
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
页:
[1]