KTV和泛型(2)
很多使用泛型的小伙伴,都会有一个疑惑:为什么有的方法返回值前带<T>、<K, V>之类的标记,而有的方法返回值前又什么都不带呢?就像这样:
// 实体基类 class Entity { public String toString() { return "Entity"; } } // 用户类 class User extends Entity { public String toString() { return "User"; } } // 用户Dao class UserDao { public String toString() { return "UserDao"; } } /** * 带<E>标记与不带<E>标记的比较 */ public class GenericsClass<T extends Entity> { // 不带标记 public void notSign(T t) { System.out.println("notSign " + t.toString()); } // 带<T>标记 public <T> void hasSign(T e) { System.out.println("hasSign " + e.toString()); } public static void main(String[] args) { GenericsClass<Entity> clazz = new GenericsClass<>(); Entity entity = new Entity(); User user = new User(); UserDao userDao = new UserDao(); System.out.println("不带标记的方法:"); clazz.notSign(entity); clazz.notSign(user); // 不能编译通过的 // 因为在GenericsClass<T extends Entity>中已经限定了全局的T为Entity及其子类, // 所以不能再加入UserDao; // clazz.notSign(userDao); System.out.println("带标记的方法:"); clazz.hasSign(entity); clazz.hasSign(user); // 带上前缀<E>,就是在告诉编译器:这是新指定的一个类型,代表该方法自己独有的某个类, // 跟GenericsClass<T extends Entity>中的Entity及其子类没有任何关系 // 或者说 // hasSign方法重新定义泛型T、隐藏或者代替了GenericsClass<T>中的T,不再受限于Entity及其子类 clazz.hasSign(userDao); } }