荷城网站制作,中小型企业网络部署,慈溪建设企业网站,weui-wordpress概念 首先聊聊泛型#xff0c;泛型是JDK5的新特性。泛型是用来指定不同类型来控制形参具体限制的类型。泛型这种语法机制#xff0c;只在程序编译阶段起作用#xff0c;只是给编译器参考的#xff08;运行阶段泛型没用#xff09;。写了这么多代码应该能知道泛型的优点就是…概念 首先聊聊泛型泛型是JDK5的新特性。泛型是用来指定不同类型来控制形参具体限制的类型。泛型这种语法机制只在程序编译阶段起作用只是给编译器参考的运行阶段泛型没用。写了这么多代码应该能知道泛型的优点就是可以使集合中存储的元素类型是统一一致的并且可以做到不需要进行大量的转型。此文章并不主要讲泛型的使用而是记录源码中泛型的用法比如T这种类型。
public class GenericTest{public static void main(String[] args){//这就是使用泛型的方法 保证此集合只存储String数据类型的元素ListString list new ArrayListString();//在JDK8后引入了新特性自动类型推断机制 可以将上面的语句简写为ListString list new ArrayList();}
}
泛型表示 首先应该知道泛型可以被用在什么地方上答案有类、接口、方法、属性。当然哈泛型不能用在八种基本数据类型上byte、short、int、long、float、double、boolena、char。必须用在类名后或者方法返回值之前。泛型的表达式主要有以下几种 1、T 普通符号 2、无边界通配符 ? 3、上界通配符 ? extends E E表示父类 4、下界通配符? super E 是E的子类 泛型擦除
public class GenericTest {public static void main(String[] args){ListString l1 new ArrayList();ListInteger l2 new ArrayList();System.out.println(l1.getClass() l2.getClass() ? true : false);//true}
}
从上面这个例子可以看出两个集合中存储的类型不一致但是得到的字节码文件是一样的。这就是因为JVM的泛型擦除机制在JVM中把泛型给忽略掉了只保留了原始类型。
静态方法与返回类型 上文说过泛型必须用在类名后或者方法返回值之前。所以如果我们编写的类中的静态方法使其返回的类型为当前类本身并且后面还加了个泛型那么静态方法后也要加泛型否则会报错这是为什么呢例子如下
public class ResultT {private T data;//这样写是会报错的public static ResultT ok(T data){return Result.ok(data);}//必须在静态方法后也加个泛型public staticT ResultT ok(T data){return Result.ok(data);}//如果不想报错就写成非静态的public ResultT ok(T data){return Result.ok(data);}
} 上述这个例子就必须研究到JVM的类加载机制 静态方法和普通方法的生命周期不一致静态方法生命周期属于类加载的时候在Java中泛型只是一个占位符必须传递具体类型才可以使用也就是类实例化的时候才传递具体参数类型由于静态方法的加载在类实例化之前也就是说在类未实例化的时候类中的泛型还没有传递真正的类型参数这时候静态方法就已经加载完成。显然静态方法不能使用/也就是访问不到泛型类中的泛型所以需要加T声明使用哪种泛型类型。所以说如果不想报错的话也可以不用静态方法。 还有一点就是关于泛型擦除。Java的泛型属于伪泛型也就是说只会在编译期才生效。编译之后会产生泛型擦除。比如T就会被JVM认成Object。