黑马程序员技术交流社区
标题:
泛型通配符部分
[打印本页]
作者:
lwy0319
时间:
2014-3-23 01:29
标题:
泛型通配符部分
本帖最后由 lwy0319 于 2014-3-23 01:51 编辑
大家好,目前在学泛型关于通配符存在的必要性暂时不是很了解希望大家能够帮我看看
class Info<T>{
private T var;
public void setVar(T var){
this.var=var;
}
public T getVar(){
return this.var;
}
}
public class Text4 {
public static void main(String[] args){
Info<String> a=new Info<String>();
Info<Object> b=new Info<Object>();
Info<Integer> c=new Info<Integer>();
a.setVar("黑马程序员");
b.setVar("黑马");
c.setVar(30);
fun(a);
fun(b);
fun(c);
}
public static<T> void fun(Info<T> a){
System.out.println(a.getVar());
}
}
复制代码
书上关于通配符的用法主要是public static void fun(Info<?> a)因为如果不加<?>会有编译警告,我同样不太了解这部分编译警告有什么影响。。。然后根据泛型方法修改之后警告没了,程序运行也没问题。。所以对它存在的必要性作用就没搞懂了。。哪位同学能帮我举个例子告诉我在哪里它有着必要性的存在么。。或者它是最优选择也行。。PS:顺便问下,泛型有同时设上下限的解决方案么?
作者:
Teale
时间:
2014-3-23 21:08
首先 public static<T> void fun(Info<T> a){
这个方法定义了泛型,如何确定这个方法到底是什么泛型呢? 这就必须在调用方法时传入这个泛型,所以括号里的Info必须有泛型。 不加泛型肯定报错。意思是你Info<String> a 你要传入这个参数,肯定要告诉方法这个泛型是String。 如果你觉得没必要,那么Info这个对象本身就是不确定泛型的,Info你定义了Object Integer String这就等于是不同的参数类型了。。。如果不定义泛型,那就定义可以变参数,那显然不是这个程序的意思。
为了让不同方法可以操作不同类型,而且类型还不确定。
那么可以将泛型定义在方法上。(泛型方法)
根据你的第二个问题,
? extends E: 可以接受E类型或者E的子类型。 上限。
* ? super E: 可以接受E类型或者E的父类型。下限。
当你传入的参数是一个有继承的关系的时候,就可以考虑 public static void fun(Info<? extends T> a){
了,对于你这个程序,我觉得就可以这么写。因为你泛型都是Object的子类。 但是如果Info泛型是int 或者其他基本类型,就只有用上面那个方法了。基本类型貌似没有上限和下限,他们不属于object
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2