泛型?与 T 的最终奥义
1.为什么要使用泛型
比如我定义了一个接口,里面的抽象方法类型不确定或者有多种,我需要这样写:
public interface Andayoung{
String young(String a);
String young(boolean a);
}
然而我使用泛型可以代表任何类型,这样大大简化了代码:
public interface Andayoung{
<T> String young(T a);
}
2.你知道泛型 T 与通配符 ? 的区别吗
简单的检索了一下大家的博客,基本上没有谁的博客弄清楚了这个问题,那么我来分析一下:
还是上面的接口,加了一个具有依赖关系的泛型方法,用泛型T来写是这样的:
public interface Andayoung< E >{
<T> Object anda(Andayoung <T> a);
<T extends E> String young(Andayoung <T> a);
}
代码块中有两个泛型T和E,其中T继承自E;
然后是通配符?来表示如下:
public interface Andayoung< E >{
Object anda(Andayoung <?> a);
boolean String (Andayoung <? extends E> a);
}
我们可以看到代码块中有一个泛型E和一个通配符?;
结合1中的例子我们,得出以下结论:
- 我们可以用泛型表示类型T a,但不可以用通配符 ? a。?总是搭配类使用,如 Andayoung<\?> a;(很神奇,不打个转义字符‘\’,MarkDown就把我后面的内容吃掉了)
- 如果泛型传入类型形参只使用一次,且仅作用于在调用时传入实参,则使用通配符?足够。
- 如果泛型传入类型形参需要表示不同类型参数之间的依赖关系,比如? extends E,则E不能为通配符。
3.最后
遍地都是黄金,只是我们缺乏慧眼。