Java泛型数组,Java泛型不指定类型参数

public class generics {
    public static void main(String[] args) {
        Student<String> s1 = new Student<>("jack", "优秀");
        Student<Double> s2 = new Student<>("Tom", 95.0);
        Student<Character> s3 = new Student<>("Bob", 'A');

        Student[] students = new Student[3];
        students[0] = s1;
        students[1] = s2;
        students[2] = s3;
    }
}

class Student<T> {
    private String name;
    private T score;

    public Student(String name, T score) {
        this.name = name;
        this.score = score;
    }
}

为什么students数组可以存不同的类型呢?students是被声明成Student类型的数组了吗,这是多态吗,Student<String>、Student<Double>、Student<Character> 都是Student的子类?

如果代码写成:

Student<Object>[] students = new Student[3];
        students[0] = s1;
        students[1] = s2;
        students[2] = s3;

就直接报错了,包括下面这句代码:

Student<String> s1 = new Student<>("jack", "优秀");
Student s = s1;//不会报错
Student<Object> s = s1;//报错

不写类型不是默认Object类型吗,为什么两句话一个报错一个不报错呢。

这个就是java的语法检查,不允许泛型转换,即使你用的是父类。

java 是强类型的,你不写类型是不行的哈。
为什么students数组可以存不同的类型呢?
答:因为你这个是Student类型的啊
这是多态吗?
答:你这不是多态,多态一般跟抽象类、接口挂钩,父类或者接口提供一个通用模板,子类实现不同的方法,比如父类定义一个绘制图形类,但是不明确绘制什么图形,可以在子类实现绘制具体的图像,如;三角形、正方形、矩形、圆形等