黑马程序员技术交流社区
标题:
java泛型问题
[打印本页]
作者:
于星星
时间:
2012-7-14 21:08
标题:
java泛型问题
本帖最后由 于星星 于 2012-7-17 10:25 编辑
public class GenericTest {
public static void main(String[] args) {
GenericTest gt= new GenericTest ();
GenericShow gs = new GenericShow ();
gs.setA("对GenericShow类中方法的调用");
gt.fun(gs);
}
public static void fun(GenericShow <? extends Number> c) {
System.out.println(c.getA());
}
}
class GenericShow<D> {
private D a;
public D getA() {
return a;
}
public void setA(D a) {
this.a = a;
}
}
复制代码
在gs.setA("对ShowGeneric类中方法的调用"); gt.fun(b);实参b为什么能够成功的传给public static void fun(ShowGeneric<? extends Number> c) 形参c;
作者:
黑马-王言龙
时间:
2012-7-14 21:26
没看懂,b哪来的?
作者:
许瑞航老师
时间:
2012-7-14 21:50
泛型不能这么写
泛型类创建对象的时候一定要确定类型,不然会出"未经检查"的警告
GenericShow gs = new GenericShow ();
如果gs对象的泛型确定类型为String
gt.fun(gs); 会报错
如果gs泛型确定为Number或其子类
gs.setA("对GenericShow类中方法的调用"); 会报错
作者:
周刚
时间:
2012-7-14 22:56
我顶!哈哈
作者:
刘笑
时间:
2012-7-14 23:03
周刚 发表于 2012-7-14 22:56
我顶!哈哈
哈哈哈哈
作者:
侯茂绵
时间:
2012-7-14 23:08
{:soso_e103:}继续顶
作者:
黑马刘涛
时间:
2012-7-14 23:12
void fun(GenericShow <? extends Number> c)/*? extends Number表示该类型为Number任何已实现的子类类型*/
gt.fun(gs); gs类型为GenericShow类型,形参c就是GenericShow类型,因此传递的实参没有不妥
复制代码
作者:
柯玲
时间:
2012-7-15 00:50
综合观察,示例可以简化解释如下:
public class GenericTest {
public static void fun(GenericShow <? extends Number> c) { //此刻限定了GenericShow操作类型为 <? extends Number>
System.out.println(c.getD());
}
public static void main(String[] args) {
GenericShow gs = new GenericShow ();
gs.setD("对GenericShow类中方法的调用");
fun(gs); //等同于同类型对象赋值,将类型限定联系起来,以此判断GenericShow的操作类型为 <? extends Number>
}
}
class GenericShow<D> { //D是不明确的类型,此时就相当于通配符?,由此知道任意类型都可以传入作限定,可以在调用或者创建此类对象时进行限定
private D d;
public D getD() {
return d;
}
public void setD(D d) {
this.d = d;
}
}
复制代码
综上不难理解gs能顺利将值传给c的原因
作者:
柯玲
时间:
2012-7-15 22:50
本帖最后由 柯玲 于 2012-7-16 06:54 编辑
今天看了泛型的高新视频,gs能顺利传给c的原因是因为JAVA程序员为保证JDK1.4代码的可读性,JDK1.5有一个规范“参数化类型与原始类型相兼容”
我们只看这三句:GenericShow gs = new GenericShow (); 表明gs是原始类型;
static void fun(GenericShow <? extends Number> c){...}:将泛型类型GenericShow<D>定义为具体的参数化类型GenericShow<? extends Number>
fun(gs); 类似于GenericShow <? extends Number> c=gs,即原始化类型指向参数化类型,gs就能顺利传值给c.
具体的<? extends Number>只是一个实际类型参数,用作具体类型限定GenericShow,与要传入的类型是不是Number及其子类无关
作者:
贾存双
时间:
2012-7-16 05:07
本帖最后由 贾存双 于 2012-7-16 05:08 编辑
形参c只是引用了实参b的地址,并不是赋值啊!
作者:
许瑞航老师
时间:
2012-7-16 17:40
许瑞航 发表于 2012-7-14 21:50
泛型不能这么写
我试了、、 确实会报错哇、、
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2