package 泛型练习03;
/**
- 父类为泛型类
- 1.属性
- 2.方法
- 注意:要么同时擦除,要么子类大于等于父类的类型
-
不能子类擦除,父类还有泛型\
- 1.属性类型
-
父类中,随父类而定
-
子类中,随子类而定
- 2.方法重写
-
随父类而定
- @author Administrator
*/
public abstract class Father<T,T1> {//abstract抽象;Fathe父类
T name;//属性
public abstract void test(T t);//方法
}
/**
-
子类使用指定具体类型
-
属性类型为具体类型
-
方法同理
*/
class Child1 extends Father<String,Integer>{//Child子类;
String t2;
public void test(String t){//test测试}
}
/** -
子类为泛型类,类型在使用时确定;子类与父类泛型一致但位置可以不同
-
@author Administrator
*/
class Child2<T1,T> extends Father<T,T1>{//Child子类;
T1 t2;
public void test(T t){//test测试
}
}
/**子类为泛型类,父类不指定类型;泛型的擦除,使用object替换
*
*/
class Child3<T1,T2> extends Father{//Child子类;
T1 name2;
public void test(Object t){//test测试
}
}
/**
-
子类与父类同时擦除
*/
class Child4 extends Father{//Child子类;
String name2;//这里只能使用指定类型
public void test(Object t){//test测试}
}
/** -
错误方法:子类擦除,父类使用泛型
/
/ class Child5 extends Father<T,T1>{//Child子类;子类擦除;编译 报错
String name2;
public void test(T t){//test测试}
}*/
//----------------------------------------------------------------
package 泛型练习03;
/** -
泛型接口与继承同理
-
泛型没有多态:
-
1.回顾:类与接口存在多态
-
2.泛型没有多态
-
如:1.直接使用;A<Object> a = new A<String>():错误
-
2.方法形参与返回类型,也不存在泛型多态
-
3.不能使用instanceof(运算符)判断是否为泛型实例:
-
a instanceof A<String>
-
@author Administrator
*/
public interface Comparable {//Comparable比较
void compare(T t);
}
//声明子类指定具体类型
class Comp implements Comparable{//Comp比较器
@Override
public void compare(Integer t) {
}
}
//擦除
class Comp1 implements Comparable{
@Override
public void compare(Object t) {//Comp比较器
}
}
//父类擦除,子类泛型
class Comp2 implements Comparable{
@Override
public void compare(Object t) {//Comp比较器
}
}
//子类泛型>=父类泛型
class Comp3 implements Comparable{
@Override
public void compare(T t) {
}
}
//---------------------------------------------------------
package 泛型练习03;
/**
- 泛型的擦除
-
1.继承;实现声明不指定类型
-
2.使用时不指定类型
- 统一Object 对待
-
1.有编译器的警告,但对编译没有影响,消除使用Object
-
2.不完全等同于Object,编译不会类型检查
- @author Administrator
*/
public class Student {
private T javase;
private T oracle;
public T getJavase() {
return javase;
}
public void setJavase(T javase) {
this.javase = javase;
}
public T getOracle() {
return oracle;
}
public void setOracle(T oracle) {
this.oracle = oracle;
}
public static void main(String[] args) {
Student stu1 = new Student();
Student<Object> stu = new Student<Object>();//消除警告:加Object
//stu.setJavase(stu);;//有警告 以Object 对待
test1(stu1);
test1(stu);
test2(stu1);
test2(stu);
}
//
public static void test1(Student<Object> a){
}
public static void test2(Student<?> a){
}
}