Java和Scala中泛型类的继承

Java和Scala中泛型类的继承

  • 1 泛型的学习
  • 2 泛型类的继承

1 泛型的学习

参考 Java编程的逻辑一书 马骏昌编写的 对泛型的讲解很详细,这里着重补充一下关于泛型类的继承

2 泛型类的继承

这里主要有三种情况:
//存在父类
class Father<T> {
    T name;
}
//这种情况时, 子类并不是一个泛型类, 就是个正常的类
class Son1 extends Father<String> {
    public static void main(String[] args) {
       Son1 s1 =  new Son1();
        String name = s1.name;
    }
}
//这个时候, 子类的泛型T和父类的泛型T是一个泛型, 创建子类的时候,需要给子类泛型确定的类型, 同时, 会把父类的泛型也指定了.
class Son2<T> extends Father<T> {
    public T print(T a) {
        System.out.println(a);
        return a;
        //return super.name; //super.name 类型是T
    }

    public static void main(String[] args) {
        String name = new Son2<String>().name;
        new Son2<Integer>().print(2);
    }
}
//继承父类的泛型, 被指定了. 但是, 子类拥有自己的泛型T, 并没有被指定,子类拥有其他泛型, 父类指定类型
class Son3<E> extends Father<String> {
    public E print(E a) {
        System.out.println(a);
        return a;
        //return super.name; //super.name 类型是String
    }

    public static void main(String[] args) {
        String name = new Son3<Integer>().name;
        new Son3().print(" ");

    }
}
//子类的T和父类的T是一个泛型,子类拥有多种泛型
class Son4<T, E> extends Father<T> {
    public E print(E a) {
        System.out.println(a);
        return a;
    }

    public static void main(String[] args) {
        String name = new Son4<String, Integer>().name;
        new Son4<String, Integer>().print(4);
    }
}

//没有指定泛型时,super.name类型是object
class Son5 extends Father {

    public static void main(String[] args) {

    }
}

//Son6 Int其实就当作是一种泛型符号 和T 、E 的效果一样
class Son6<Int> extends Father<String> {

    public static void main(String[] args) {

    }
}

scala泛型反编译对比

/**
  * Desc:
  *
  * @author:chengli
  * @date:2020 /11/20 9:19
  */
class Message[T](s:T) {
  def get: T = s

  def midList[E](s:Array[E]): E ={
    s(s.length/2)
  }
}
//
class IntMessage[Int](v:Int) extends Message(v)
class Int2Message(v:Int) extends Message[Int](v)
class Int3Message[Int](v:Int) extends Message[Int](v)
class Int4Message(v:Int) extends Message(v)
class StringMessage[E](v:String) extends Message[String](v)
class StringMessage2[E](v:E) extends Message[E](v)

object Test{
  def main(args: Array[String]): Unit = {
      new IntMessage[Int](3)
  }
}

你可能感兴趣的:(Scala,java,JAVA泛型类的继承,scala)