集合中的元素最好都是类型相同的,你不能第一个值是Integer,第二个值是String,第三个又是Integer,这样就乱了,也就存在这隐患,所以Java提供了泛型来解决这个安全问题,就跟数组一样,都要存储相同的数据类型的.此时引入了泛型的概念.你定义一个集合的话,没有加泛型,他就是默认的object,你可以定义为等,这样集合中的所有元素都素String元素,而且也只能输入String类的值或者其他操作.
那么是什么是泛型呢?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。
参数化类型,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式,然后在使用/调用时传入具体的类型。
泛型有三种使用方式,泛型类,泛型接口和泛型方法。
7.2泛型类泛型类就是一个类的泛型,比如说你定义了一个car类,他里面有属性车的品牌,车的价值,把这个车实体化之后,每个车都有这样的属性,这个car类也就可以称为一个泛型类了.
public class car{//car类是泛型类 private T name;//属性为T,外部传来啥属性 这就是啥属性 public car(T name) {//构造方法中的类型也为T,类型由外部指定 this.name = name; } public T getName() { return name; } public void setName(T name) { this.name = name; } } public class test { public static void main(String[] args) { car a=new car<>("bm");//传进去的是String System.out.println(a.getName()); } } bm
1.泛型的类型参数只能是类类型
2.泛型的类型参数可以有多个。
3.如果没有定义具体类型,默认为Object
7.3从泛型类派生子类子类也是泛型类,子类和父类的泛型类型要一致
class A extends Demo
子类不是泛型类,父类要明确泛型的数据类型
class A extends Demo
7.4泛型接口基本用法和泛型类是一样的,泛型接口与泛型类的定义及使用基本相同。
public interface Demo7.5泛型通配符{ //定义一个泛型接口 public T next(); } class A implements Demo {//子类也是泛型类,子类和父类的泛型类型要一致 @Override public T next() {//接口重写方法 return null; } } public class A implements Demo {//子类不是泛型类,父类要明确泛型的数据类型 @Override public String next() { return null; } }
?是类型通配符,可以代表具体类型实参,只能在实际传入参数的地方使用,不能再定义的时候使用。
public void car> {} 这就是错误的使用car
public static void main(String[] args) {
car>a=new car(123);
car>b=new car("abc");//?表示传进去的是什么就是什么类型
System.out.println(a.getName());
System.out.println(b.getName());
}
123
abc
类型上限,T可以是任意类型,例如 extends Number>,意思是 传进来的泛型只能是Number和Number类的子类比如Interger,像Object,String类就不行。
类型下限,只能传入T和T的父类,比如,此时,传进来的参数只能是Number和他的父类比如Object,此时Interger就传不进来了.
public class fanxing7.6类型擦除{ private T key; public void test1(fanxing key){ } public void test(fanxing key){ } public static void main(String[] args) { fanxing a=new fanxing(); fanxing
泛型出现在jdk1.5之后,在这之前java可能还不支持泛型,所以在底层还是用Object,泛型的作用主要是在编译期间。所以在代码进入JVM之后,系统会自动换成Object类型,与泛型相关的信息会被擦除,这就叫类型擦除



