您的位置:首页 > 编程语言 > Java开发

关于泛型接口我的初理解

2015-03-13 20:55 239 查看
一背景

以下是本人在百度知道看到的关于泛型接口的一个回答,地址是:http://zhidao.baidu.com/question/195124074.html

现在我刚刚接触泛型接口。有点不
4000
理解。所以百度了一下,看到了这个会回答。

我打算写下我的理解(先说明我刚刚接触泛型接口,所以我下面先展示原文,再写下我的理解,只供参考,我关于它我有更新的认识会更新)

二原文

以下是原文:

应该是我很久没有好好学技术了,有时候想用的时候却发现不会写,比如今天遇到了泛型接口,所以要记录一下,这样才能更明白...
在这里我并不想说泛型接口怎么写,这个很简单,后面会写的,只是想说我为什么要用.
泛型接口的意图是什么?请看如下的问题:

Java代码
abstract class BaseBean{
//略
}

Interface IA{
public BaseBean doSomething();
}

下面我们继承这个BaseBean
Java代码
class ChildBean extends BaseBean{

}

接下来实现接口
Java代码
class IAImpl implements IA{
public BaseBean doSomething(){
return new ChildBean();
}
}

好了这是惯常的写法,但是同学们有没有发现一个问题当你返回得到BaseBean的时候其实你需要的是他的实例而不是这个真实的Bean,而当你强转时又需要注意两点: NullPoint 和 类型是否对,这个很麻烦,因为调用者完全不知道调用什么.那么我们来描述我们需要什么:
我们需要IA的doSomething返回的是一个对象这个对象extends于BaseBean

那么接下来我们就用泛型接口吧:
Java代码
Interface IA<T extends BaseBean>{
public T doSomething();
}

class IAImpl implements IA<ChildBean>{
public ChildBean doSomething(){
return new ChildBean();
}
}

这样当你调用这个实现的时候就能明确地得到返回的对象类型,清楚明了,这就是泛型接口的使用.其实我们平时一直在用的 Iterable就是这玩意大家可以去看下. 回家准备读下java编程思想中的相关段落.
总结今天收获很大,这里要感谢下灵芝同学给我的帮助,是她告诉了我,我所想要的东西叫泛型接口,感谢...
下次等我把泛型都再重新回炉下,再来把泛型的其他东西讲来听听.

原文结束。

三理解

(下面我按我的理解修改原文)

/*定义一个类BaseBean,它是抽象的,里面各种方法。
我们要做的是找个类继承它(因为它是抽象类),然后获得实现它的这个类指向父类的实例(对象 )(多态),这个是终极目标。*/
abstract class BaseBean{
//略
}  
//好了,就像上面说的,接下来,我们找个类实现它,实现它的这个类叫做ChildBean类  
class ChildBean extends BaseBean{

}
//好了,到了这里我们,得到了ChildBean类,我们用BaseBean b = new ChildBean();就完成了终极目标。
//虽然以上方法可以用,但是我们可以用接口,来实现相同的功能。下面我们再来实现一次终极目标。
//当然,首先定义一个接口叫IA,接口里有一个方法,该方法,返回的类型是BaseBean,它可以通过多态帮助我们实现终极目标。
Interface IA{
public BaseBean doSomething();
}
//为什么,它可以呢?下面我用一段代码表示一下。
class ChildBean extends BaseBean{

} 
class TextDemo implements IA{
public BaseBean doSomething(){
return new ChildBean();
//有安全隐患
}
}
//到这里大家可以比较这两种实现方式
//第一种通过一个类继承它,再获得其指向父类的对象。
//第二种是让一个类本身具备方法来获得它。
/*
看到这里大家是不是会感觉用接口的方式有些,画蛇添足的感觉。为什么?
因为你们肯定想到,虽然第二种把实现终极目标把过程封装成方法有一定的优越性
但是我可以直接不实现接口,就像这样做
class TextDemo /*implements IA*/{
public BaseBean doSomething(){
return new ChildBean();
} //也有安全隐患
}
这样不是比较方便吗?我又何必实现一个接口(虽然接口可以多实现),而且两种通过接口的方法都有安全隐患。
它们的安全隐患在于:如果父类BaseBean有多个子类。除了ChildBean还有ChildBean1 , ChildBean2等等等等
那么我们的方法了返回值虽然是父类类型可我们return 的子类可有多种。
那么我们需要的是那个子类?我们无法限制。所以new 后面的各种子类都不会编译报错!
所以强转的时候就会出现问题比如
ChildBean c = (ChildBean)b;
我们不知道b是ChildBean1类型。所以运行时就报错说ChildBean1 无法转成ChildBean类型。
So泛型接口诞生了,它怎么解决这个安全问题呢?
*/
//那么接下来我们就用泛型接口吧: 
//回忆上面说过的我们不用接口,直接用方法的理由是因为用接口在这里多此一举。
//那么我们如果通过接口给方法附加限制条件的话,用接口就可以理解了。
//而在这里,给方法限制的条件同过泛型。
//此时实现了的终极目标具有方法的优越性,和安全性!
Interface IA<T extends BaseBean>{
public T doSomething();
}
class IAImpl implements IA<ChildBean>{
public ChildBean doSomething(){
return new ChildBean();
}
}  
//呵呵,买个萌先
//就我目前,我现在还没有真正进入泛型接口的学习(这篇博文写后就学习去),以上是感性的简单的理解,说不对的欢迎拍砖。
三end
java_haha....学习去了.
望共同进步!

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java