- 泛型提供通用方法
- 指定泛型类型的范围,使用extends或super
- extends继承demo
- 泛型多继承
public static指定泛型类型的范围,使用extends或superT test(Class clazz) throws InstantiationException, IllegalAccessException { System.out.println(clazz.getName()); return clazz.newInstance(); }
extends: 继承限定T的范围上限 super: 限定T范围下限限定T要继承User3类或实现User3接口 限定T是User3的超类 限定T要继承UserTest1类或实现UserTest1接口,并且要实现User5接口
限制效果:T必须继承User3,否则在运行时会报类型转化异常
@Data
class UserTest1 {
}
public staticvoid test5(List list) { for (T t : list) { System.out.println(t); } }
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
List objects1 = Lists.newArrayList();
UserTest1 userTest1 = new UserTest1();
objects1.add(userTest1);
GenericTopic.test5(objects1);
}
test5泛型方法,并指定泛型的范围是继承User3,但是UserTest1并没有继承User3,在遍历list时,就会报类型转化异常。如下异常
Exception in thread "main" java.lang.ClassCastException: com.enterprise.article.base.generic.UserTest1 cannot be cast to com.enterprise.article.base.generic.User3 at com.enterprise.article.base.generic.GenericTopic.test5(GenericTopic.java:70) at com.enterprise.article.base.generic.UseGeneric.main(GenericTopic.java:164)泛型多继承
限制效果:
- T必须继承UserTest1,否则在运行时会报类型转化异常
- 在执行User5接口中存在的方法时,T必须实现User5定义的该方法,否则在运行时会报类型转化异常
public staticT test6(List list) { for (T t : list) { t.user5Method(); t.user1Method(); } return list.get(0); }
@Data
class UserTest1 {
}
interface User5 {
Long user5Id = 123L;
Long userId = null;
void user5Method();
}
@Data
class UserTest2 extends UserTest1 {
public void user5Method() {
System.out.println("UserTest2 a方法");
}
}
Test:
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
List objects1 = Lists.newArrayList();
UserTest2 userTest2 = new UserTest2();
objects1.add(userTest2);
GenericTopic.test6(objects1);
}
在UserTest2不实现User5接口的情况下,执行t.user5Method()会报如下异常。
Exception in thread "main" java.lang.ClassCastException: com.enterprise.article.base.generic.UserTest2 cannot be cast to com.enterprise.article.base.generic.User5
原因是在执行User5接口中存在的方法时,如user5Method方法,T类必须实现并覆盖User5的该方法。才能执行该方法。
以下场景能够运行成功:
- 该方法没有在User5接口中定义,并且该方法是UserTest1的方法。
- 不执行User5中的方法,相当于,去除了实现User5的限制



