分析苏宁易购的网站建设,网站建设net接口,用地方别名做网站名,怎样在网做旅游网站文章目录 1. 为什么要有泛型Generic2. 泛型怎么用2.1. 泛型类2.2. 泛型接口2.3. 泛型方法 3. 泛型通配符3.1. 通配符3.2. 有限制的通配符 1. 为什么要有泛型Generic 泛型#xff0c;JDK1.5新加入的#xff0c;解决数据类型的安全性问题#xff0c;其主要原理是在类声明时通过… 文章目录 1. 为什么要有泛型Generic2. 泛型怎么用2.1. 泛型类2.2. 泛型接口2.3. 泛型方法 3. 泛型通配符3.1. 通配符3.2. 有限制的通配符 1. 为什么要有泛型Generic 泛型JDK1.5新加入的解决数据类型的安全性问题其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。 Java泛型可以保证如果程序在编译时没有发出警告运行时就不会产生ClassCastException异常。同时代码更加简洁、健壮。
举例
package day11;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {List list new ArrayList();//不指定泛型可以向list集合中添加各种类型元素list.add(111);list.add(sss);list.add(true);//需求只能在集合中存字符串ListString l new ArrayListString();l.add(xx);
// l.add(111);//指定的String类型不可以添加String以外的元素类型}} Java中的泛型只在编译阶段有效。在编译过程中正确检验泛型结果后会将泛型的相关信息擦除并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说泛型信息不会进入到运行时阶段。 解释 视频中老师说比如上段代码中最后一行的l.add(111)在编译期间就会报错只有删除这一行或者将里面的数据改成String类型后才可以通过编译。 2. 泛型怎么用
2.1. 泛型类
对象实例化时不指定泛型默认为 Object 。 泛型不同的引用不能相互赋值。
package day11;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {AString a1 new AString();//在new A的对象的时候指定泛型的类型Stringa1.setKey(xxxx);//对象使用setKey(T key)方法中的key形参就是StringSystem.out.println(a1.getKey());//T getKey(),返回值就有new对象确定返回值是StringAInteger a2 new AInteger();a2.setKey(1);Integer i a2.getKey();A a3 new A();//不指定泛型相当于指定了一个Object类型//AObject a3 new AObject();//等同于上行代码a3.setKey(new Object());Object obj a3.getKey();//同样的类但是在new对象时指定不同的数据类型那么这些对象不能互相赋值a1 a2;//错误不同的数据类型不能互相赋值}}/*** 此处的泛型‘T’可以任意的取名即可换成A,B,C等* 一般使用T译为type* author 14532** param T*/
class AT{// 中的内容可以任何取名按惯例是Tprivate T key;public void setKey(T key) {this.key key;}public T getKey() {return this.key;}
}2.2. 泛型接口
定义一个泛型接口 interface GeneratorT { T next(); } ①未传入泛型实参时与泛型类的定义相同在声明类的时候需将泛型的声明也一起加到类中 ②如果实现接口时指定接口的泛型的具体数据类型这个类实现接口所有方法的位置都要替换实际的具体数据类型
举例
package day11;public class Test1 {public static void main(String[] args) {B1Object b1 new B1Object();B1String b11 new B1String();B2 b2 new B2();//不用指定泛型指定泛型反而会报错}
}interface IBT{T test(T t);
}/*** 未传入泛型实参时与泛型类的定义相同在声明类的时候需将泛型的声明也一起加到类中* author 14532** param T*/
class B1T implements IBT{//B1T:未传入实参将泛型的声明T也一起加到类中Overridepublic T test(T t) {return t;}
}/*** 如果实现接口时指定接口的泛型的具体数据类型* 这个类实现接口所有方法的位置都要替换实际的具体数据类型* author 14532**/
class B2 implements IBString{Overridepublic String test(String t) {return null;}
}2.3. 泛型方法 方法也可以被泛型化不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数此时参数的类型就是传入数据的类型。
泛型方法的格式 public class DAO { public E void show(E e){ System.out.println(e.toString()); } public T T show1(T t){ return t; } } 举例
class Cc{/*** 无返回值的泛型方法* param T* param s*/public T void test(T s) {T t s;}/*** 有返回值的泛型方法* param T* param s* return*/public T T test1(T s) {return s;}/*** 形参为可变参数的泛型方法* param T* param strs*/public T void test2(T... strs) {for(T s : strs) {System.out.println(s);}}}举例2
package day11;public class Test1 {public static void main(String[] args) {CcObject c new CcObject();c.test(xxx);//泛型方法在调用之前没有固定的数据类型//在调用时传入的参数是什么类型就会把泛型改成什么类型//也就是说泛型方法会在调用时确定泛型的具体数据类型Integer i c.test1(2);//传递的参数是Integer泛型就固定成Integer返回值就是IntegerBoolean b c.test1(true);//传递的参数是Boolean泛型就固定成Boolean返回值就是Boolean}
}class CcE{private E e;// public static void test3() {
// //在静态方法中不能使用类定义的泛型如果要使用泛型只能使用静态方法自己定义的泛型
// //System.out.println(this.e);
// }/*** 静态方法的泛型方法* param T* param t*/public static T void test3(T t) {//在静态方法中不能使用类定义的泛型如果要使用泛型只能使用静态方法自己定义的泛型System.out.println(t);}/*** 无返回值的泛型方法* param T* param s*/public T void test(T s) {//在类上定义的泛型可以在普通的方法中使用System.out.println(this.e);T t s;}/*** 有返回值的泛型方法* param T* param s* return*/public T T test1(T s) {return s;}/*** 形参为可变参数的泛型方法* param T* param strs*/public T void test2(T... strs) {for(T s : strs) {System.out.println(s);}}}3. 泛型通配符
3.1. 通配符
不确定集合中的元素具体的数据类型使用?表示所有类型 如 public void test(List? list){System.out.println(list);}举例
package day11;import java.util.ArrayList;
import java.util.List;public class Test2 {public static void main(String[] args) {Dd d new Dd();ListString l1 new ArrayListString();//?:可以代表各种类型如String、Integerd.test(l1);ListInteger l2 new ArrayListInteger();d.test(l2);}}class Dd {public void test(List? list) {//test方法需要一个list集合的参数不确定list集合中到底是存的数据的类型是什么}
}3.2. 有限制的通配符
举例 ? extends Person (无穷小, Person) 只允许泛型为Person及Person父类的引用调用 ? super Person [Person, 无穷大] 只允许泛型为Person及Person父类的引用调用 ? extends Comparable 只允许泛型为实现Comparable接口的实现类的引用调用 举例
package day11;import java.util.ArrayList;
import java.util.List;public class Test2 {public static void main(String[] args) {Dd d new Dd();//list参数的元素数据类型是CC1及其子类ListCC1 lc new ArrayListCC1();d.test1(lc);ListDD1 ld new ArrayListDD1();d.test1(ld);// ListBB1 lb new ArrayListBB1(); //BB1不是CC1的子类
// d.test1(lb);//list参数的元素数据类型是CC1及其父类 d.test2(lc);ListBB1 lb new ArrayListBB1();d.test2(lb);ListAA1 la new ArrayListAA1();d.test2(la);// d.test2(ld);//DD1不是CC1的父类//list参数的元素数据类型是IA的实现类ListIAImpl lia new ArrayListIAImpl();d.test3(lia);// d.test3(la);//AA1不是IA的实现类}
}class Dd {public void test(List? list) {//test方法需要一个list集合的参数不确定list集合中到底是存的数据的类型是什么}public void test1(List? extends CC1 list) {//list参数的元素数据类型是CC1及其子类}public void test2(List? super CC1 lsit) {//参数的元素数据类型是CC1及其父类 }public void test3(List? extends IA lsit) {//list参数的元素数据类型是IA的实现类}
}class AA1{}class BB1 extends AA1{}class CC1 extends BB1{}class DD1 extends CC1{}interface IA{}class IAImpl implements IA{}