A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 涂金哲 中级黑马   /  2012-7-31 17:36  /  2590 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class A<T>{
    T t;
    A(T o){
        t=o;
    }
}
class B<T> extends A<T>{

    B(T o) {
        super(o);
    }
}
class Test{
        //B b=new B();    //此类型的创建会出错 即使
        B<String> b=new B<String>("hah");
    }
B类的泛型类型传递给A类,如果B类的对象不需要定义泛型 ,我们应该怎么办?
为什么不能创建不带泛型的B类的对象?

9 个回复

倒序浏览
我是来围观的  对于泛型 我就记住了  数据类型的 限定 其他的 我也是稀里糊涂 管他那么多呢  只要能用就行嘛  哈哈
回复 使用道具 举报
陈红建 发表于 2012-7-31 18:06
我是来围观的  对于泛型 我就记住了  数据类型的 限定 其他的 我也是稀里糊涂 管他那么多呢  只要能用就行 ...

这是一个泛型类的超类  我也不明白
回复 使用道具 举报
额~~~你这个不能创建不带泛型的对象不成功
原因不在泛型的问题上
你这样写肯定能创建成功 B b=new B("hah");
因为你没有空参数的构造函数
B b=new B();这样写自然会出错
回复 使用道具 举报
徐然 发表于 2012-7-31 20:49
额~~~你这个不能创建不带泛型的对象不成功
原因不在泛型的问题上
你这样写肯定能创建成功 B b=new B("hah") ...

不会吧,我觉得问题应该出在子类是否一定要加上泛型,应为创建子类对象父类的构造器肯定要去初始化,而父类初始化用到了泛型,子类在创建的时候必须得带上吧,我不知道这样理解对不对,请指教
回复 使用道具 举报
我也觉得是构造函数的错误,你这个构造函数上错了。没有默认的构造函数。
class A<T>{
    T t;
    A(T o){
        t=o;
    }
}
class B<T> extends A<T>{

    B(){
       super(o);
    }
    B(T o) {
        
    }
}
class Test{
        //B b=new B();    //此类型的创建会出错 即使
        B<String> b=new B<String>("hah");
    }

回复 使用道具 举报
B b=new B();   
没有空参数的构造函数,这样定义编译不会通过
回复 使用道具 举报
徐然 黑马帝 2012-8-1 14:25:20
8#
涂金哲 发表于 2012-8-1 11:52
不会吧,我觉得问题应该出在子类是否一定要加上泛型,应为创建子类对象父类的构造器肯定要去初始化,而父类 ...

其实,你这种用构造方法进行泛型类型传递,限定的只是构造函数的参数类型必须与对象泛型类型一致
你在告诉构造函数,对象必须有一个任意类型参数
另外,泛型是作用于编译时期的,编译器只是会检查你的对象与类的泛型是否一致,如果对象没有写泛型,他就不知道你要用什么类型,他会提示你类上有泛型,如果对象没有,可能会有安全隐患,但并不阻止你编译通过,如果有泛型类型,则可以是任意类型.
其实API中有很多这种例子,比如ArrayList,它的类中就有任意类型泛型,但是你在创建实例对象的时候不加泛型也一样通过编译.
但是你一旦给类上确定了泛型的实际参数类型,那么你创建对象时要么不加泛型,要加就必须跟类的一致
所以创建对象时是可以不加泛型的.
可能说得有点乱,不知道能不能帮助你理解
回复 使用道具 举报
王渠 发表于 2012-8-1 11:58
我也觉得是构造函数的错误,你这个构造函数上错了。没有默认的构造函数。

...

sorry 拷贝错了 B b=new B("hah") …明白了
回复 使用道具 举报
王渠 发表于 2012-8-1 11:58
我也觉得是构造函数的错误,你这个构造函数上错了。没有默认的构造函数。

...

sorry 拷贝错了 B b=new B("hah") …明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马