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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红霞 中级黑马   /  2012-7-18 22:12  /  1638 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红霞 于 2012-7-19 14:27 编辑

interface Inter<T>
{
        void show(T t);
}

class InterImpl implements Inter<String>
{
        public void show(String t)
        {
                System.out.println(t);
        }
}

class InterImpl<T> implements Inter<T>//为什么会出现红色部分的差别?是什么意思?
{
        public void show(T t)
        {
                System.out.println(t);
        }
}
class  GenericDemo
{
        public static void main(String[] args)
        {
                InterImpl i=new InterImpl();
                i.show("hh");


                InterImpl<Integer> i=new InterImpl<Integer>();
                i.show();

        }
}

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
王红霞 发表于 2012-7-19 08:41
我只是不懂在 是具体数据类型和不是具体数据类型的差别  为什么有  在InterImpl后有没有  的区别? ...

接口使用的数据类型不确定,实现类使用的数据类型依然不确定,就可以这样去写了.你在使用这个接口实现类的时候可以随意对任意类型数据进行操作.
回复 使用道具 举报
其实用不用泛型都可以的,之所以在InterImpl后面加上<T> 是为了更好地进行控制。
InterImpl<Integer> i=new InterImpl<Integer>();你看到没有,这里在创建对象的时候就将 i 限定为integer类型的,那么在对 i 进行调用的时候就可以避免需要进行转型的麻烦。比如说:
我们定义一个类:class InterImpl implements Inter
{
        public void show(String t)
        {
                System.out.println(t);
        }
}
InterImpl i=new InterImpl();
int t=3;
i.show(t);//这时就会报错,因为InterImpl类中的show方法只能传入一个String类型的。可是我们可以看到其接口Inter是一个泛型,应该是可以接收任何数据才对啊。所以我们需要对InterImpl类向上转型,才能调用其父类方法。
相比之下,使用泛型类就方便很多了。
回复 使用道具 举报
袁錦泰 发表于 2012-7-19 00:14
我感觉接口本身就不应该明确具体的数据类型,写个泛型参数代表类可以操作任意数据类型,也就是将泛型做到抽象 ...

我只是不懂在 是具体数据类型和不是具体数据类型的差别  为什么有  在InterImpl后有没有<T>  的区别?

未命名.jpg (2.92 KB, 下载次数: 54)

未命名.jpg

未命名1.jpg (3.8 KB, 下载次数: 51)

未命名1.jpg
回复 使用道具 举报
我感觉接口本身就不应该明确具体的数据类型,写个泛型参数代表类可以操作任意数据类型,也就是将泛型做到抽象,与接口遥相呼应.
你定义的接口时泛型无法确定就写个参数表示,你实现这个接口以后依然无法确定到底类要统一对什么数据类型进行操作,所以你随之可以为你的实现类加个泛型参数,这时你要注意从父类到子类再到子类的实现方法中传入的参数的泛型都必须是相同的泛型参数,,这东西逻辑性不是狠强呀,应该狠容易理解吧.
就说这么多,如果还没理解就直接M我吧.
回复 使用道具 举报
泛型
        (1)是JDK1.5以后出现的新特性.把运行过程中可能出现的问题转移到了编译期.
        (2)没有使用范围有哪些问题呢?
                A:黄线警告
                B:避免了ClassCastException异常
                C:我们的集合使用不在需要强制转换了
        (3)能够判断哪些类是需要用泛型的.在集合类中要回使用泛型.
        (4)自定义泛型
                A:泛型加在类上
                B:泛型加在方法上
                C:泛型加在接口上

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

你问的意思是不是说加不加<T>有什么区别?上面已经提到,加了<T>就表示他是一个泛型。也就是说所操作的数据类型被指定为一个参数。 他所操作的类型只能是T类的。





评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马