Java自定义泛型类和泛型方法

泛型类

定义:定义类时使用泛型。

格式:<>

class 类名<字母列表>{

修饰符 字母 属性;

修饰符 构造器(字母){   }

修饰符 返回类型 方法(字母)

}

//不能使用在静态属性、静态方法上

使用:指定具体类型

1.编译时会进行类别检查;

2.获取数据时不需要强制类型转换。

扫描二维码关注公众号,回复: 2553846 查看本文章

//泛型使用时不能基本类型

泛型常见字母

  • T Type 表示类型
  • K V 分别代表键值中的Key、Value
  • E 代表Element
  • ?表示不确定的类型
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();  //自动拆箱
    } 

}

泛型方法

定义使用:<字母>

修饰符<字母>返回类型 方法名(字母){    }

要定义泛型方法,只能将于泛型参数列表置返回值前。

注意:泛型还可以定义在方法中,是否拥有泛型方法,与其所在的类是否是泛型没有关系。

public class TestMethod {
    public static void main(String[] args){
        test("a");  //T----->String
    }
    //泛型方法
    public static <T> void test(T a){
        System.out.println(a);
    }
}

泛型没有多态

1.回顾:类与接口存在多态

2.泛型没有多态

     直接使用:A<Object> a = new A<String>();------------错误

     方法形参与返回类型也不存在泛型多态

3.不能使用instanceof 判断是否为泛型实例         a  instanceof  A<String>

  


/**
 * 父类为泛型类
 * 1、属性
 * 2、方法
 * 
 * 要么同时擦除,要么子类大于等于父类的类型,
 * 不能子类擦除,父类泛型
 * 1、属性类型
 *  父类中,随父类而定 
 *  子类中,随子类而定
 * 2、方法重写:
 *  随父类而定
 * 
 * 
 * @author Administrator
 *
 * @param <T>
 */
public abstract class Father<T,T1> {
	T name;
	public abstract void test(T t);

}
/**
 * 子类声明时指定具体类型
 * 属性类型为具体类型
 * 方法同理
 */
class Child1 extends Father<String,Integer>{
	String t2;
	@Override
	public void test(String t) {
	}	
}
/**
 * 子类为泛型类 ,类型在使用时确定
 * @author Administrator
 *
 */
class Child2<T1,T,T3> extends Father<T,T1>{
	T1 t2;

	@Override
	public void test(T t) {
		
	}
	
	
}
/**
 * 子类为泛型类,父类不指定类型 ,泛型的擦除,使用Object替换
 */
class Child3<T1,T2> extends Father{
	T1 name2;
	@Override
	public void test(Object t) {
		// TODO Auto-generated method stub		
		
	}
	
}
/**
 * 子类与父类同时擦除
 */
class Child4 extends Father{
	String name;	
	@Override
	public void test(Object t) {
		
	}
	
}
/**
 *错误:子类擦除,父类使用泛型
class Child5 extends Father<T,T1>{
	String name;	
	@Override
	public void test(T t) {
		
	}
*/
	

猜你喜欢

转载自blog.csdn.net/jxqingge/article/details/81271285