1.testGeneric01
package testGeneric01; /** * 获取值: * 1、强制类型转换 * 2、手动类型检查:避免转换错误 java.lang.ClassCastException: * @author Wang * */ public class gen01 { public static void main(String[] args) { Object obj = 80; //int score =(int)obj; //jdk1.7以后 Object -->integer -->自动拆箱 int score=(Integer)obj; System.out.println(score); //存入整数 int -->Integer -->Object Student stu = new Student(80,90); System.out.println("分数为:"+stu.getJavase()+","+stu.getOracle()); int a = (Integer )stu.getJavase();//返回来的Object类型的 所以要强制转换 System.out.println(a); } }
package testGeneric01; /** * Object 可以接收任意的类型 因为发生了多态 * @author Wang * */ public class Student { private Object javase; private Object oracle; public Student() { } public Student(Object javase, Object oracle) { super(); this.javase = javase; this.oracle = oracle; } public Object getJavase() { return javase; } public void setJavase(Object javase) { this.javase = javase; } public Object getOracle() { return oracle; } public void setOracle(Object oracle) { this.oracle = oracle; } }
2.testGeneric02
package testGeneric02; /** * 接口中泛型字母只能使用在方法中,不能使用在全局变量中 * @author Wang * */ public class Comparator <T> { void compare(T t) { } }
package testGeneric02; import java.io.Closeable; import java.io.IOException; /** * 测试泛型方法的使用: * 1.泛型方法<>(<>里面的东西代表类型变量) 要加在修饰符的后面 返回值类型之前 * 2.泛型方法只能访问对象信息而不能修改对象信息 * @author Wang * */ public class TestMethod { public static void main(String[] args) { test("a"); } public static <T> void test(T a) {//这是一个泛型方法 (为什么有static修饰不是说泛型不能用在静态方法上吗) System.out.println(a); } public static <T extends Closeable> void test(T... a){ for(T temp:a){ try { if(null!=temp){ temp.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
package testGeneric02; /** * 泛型类:在声明的时候使用泛型 * 字母: * T Type 表示类型 * K V 分别代表键值对中 Key 和 Value * E 代表Element * 在使用时(创建对象时)确定泛型 * 注意: * 1.泛型只能使用引用类型,不能是基本类型(引用类型 就是Integer 那种需要先声明 然后在在堆里创建对象那种) * 2.泛型声明时字母不能使用在静态属性或静态方法上; * * @author Wang * */ public class Student <T1,T2> { private T1 javaScore; private T2 oracleScore; //泛型声明时不能使用 静态属性|静态方法上 //private static T1 test; public T1 getJavaScore() { return javaScore; } public void setJavaScore(T1 javaScore) { this.javaScore = javaScore; } public T2 getOracleScore() { return oracleScore; } public void setOracleScore(T2 oracleScore) { this.oracleScore = oracleScore; } public static void main(String[] args) { //使用时指定类型(引用类型) Student<String,Integer> stu = new Student<String,Integer> (); //1、安全:类型检查 stu.setJavaScore("优秀"); //2、省心:类型转换 int it =stu.getOracleScore(); //自动拆箱 } }3.testGeneric03
package testGeneric03; /** * 父类为泛型:这里把他的方法和属性都定义成泛型 * * 子类在继承的时候: * 1.可以同时擦处 * 2.可以子类类型大于等于父类 * 3.根据2可以得出不能子类擦出父类泛型 * * (1).属性的类型 * 1.父类中随父类而定 * 2.子类中随子类而定 * (2).方法的重写: * 1.随父类而定(毕竟是重写父类的方法) * * * @author Wang * */ public abstract class Father <T,T1> { T name; public abstract void test(T t); } /** * 子类声明的时候指定具体类型 * 子类里面的方法和属性就会变为具体类型 * */ class Child1 extends Father<String,Integer>{ String name ; @Override public void test(String t) { // TODO Auto-generated method stub } } /** * 子类为泛型 他的类型就会在使用的时候确定 */ class Child2<T,T1,T2> extends Father<String,Integer>{ T name ; @Override public void test(String t) {//重写跟随父类而定 // TODO Auto-generated method stub } } /** * 子类为泛型,父类不指定类型,这个就是泛型的擦除,擦除后是会使用Object进行替换 * */ class Child3 <T,T2> extends Father{ T name; @Override public void test(Object t) {//泛型被擦除了 // TODO Auto-generated method stub } } /** * 子类与父类同时擦除 */ class Child4 extends Father{//那么在这里使用泛型就毫无意义了 String name; @Override public void test(Object t) { // TODO Auto-generated method stub } } /* 子类擦除,父类使用泛型 这样是错误的 因为子类的范围小于父类的范围了 class Child5 extends Father<T,T1>{ String name; @Override public void test(T t) { } */
package testGeneric03; /** * 泛型接口的实现:与继承父类是同理的 * @author Wang * */ public interface Comparable <T> { void compare(T t); } //实现类不泛型 接口泛型 class Comp implements Comparable<Integer>{ @Override public void compare(Integer t) { // TODO Auto-generated method stub } } //实现类不泛型 接口的擦除 class Comp1 implements Comparable{ @Override public void compare(Object t) { // TODO Auto-generated method stub } } //实现类泛型 接口擦除 class Comp2<T> implements Comparable{ @Override public void compare(Object t) { // TODO Auto-generated method stub } } //实现类泛型 >= 接口泛型 class Comp3<T,T1> implements Comparable<T>{ @Override public void compare(T t) { // TODO Auto-generated method stub } } //父类泛型,子类擦除 错误 //反正就是一句话 子类的范围 >= 接口
package testGeneric03; /** * 在这里我们测试泛型的擦除 * 1.继承或实现声明 不指定类型 * 2.使用是不指定类型 * 擦除以后就同意按照Object来对待 因为编译时不会类型检查 * * @author Wang * */ public class Student <T> { private T mathScore; private T englishScore; public T getMathScore() { return mathScore; } public void setMathScore(T mathScore) { this.mathScore = mathScore; } public T getEnglishScore() { return englishScore; } public void setEnglishScore(T englishScore) { this.englishScore = englishScore; } public static void main(String[] args) { Student stu = new Student();//这个就是擦除了 直接按照Object来对待 test(stu); test1(stu); } public static void test(Student <Integer> a) { } public static void test1(Student <?> a){ } }4.关于基本类型存放在哪里的问题;