Java-Interface<T>泛型接口初理解

泛型接口:提高安全性;方便转型
一背景
	以下是本人在百度知道看到的关于泛型接口的一个回答,地址是:http://zhidao.baidu.com/question/195124074.html
	现在我刚刚接触泛型接口。有点不理解。所以百度了一下,看到了这个会回答。
	我打算写下我的理解(先说明我刚刚接触泛型接口,所以我下面先展示原文,再写下我的理解,只供参考,我关于它我有更新的认识会更新)
二原文
	以下是原文:
应该是我很久没有好好学技术了,有时候想用的时候却发现不会写,比如今天遇到了泛型接口,所以要记录一下,这样才能更明白...
在这里我并不想说泛型接口怎么写,这个很简单,后面会写的,只是想说我为什么要用.
泛型接口的意图是什么?请看如下的问题:

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();  
	}  
}  
2018-06-06

Mr.Chenyb 随笔记录,只为自己使用方便

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java泛型Java 5引入的新特性,可以提高代码的可读性和安全性,降低代码的耦合度。泛型是将类型参数化,实现代码的通用性。 一、泛型的基本语法 在声明类、接口、方法时可以使用泛型泛型的声明方式为在类名、接口名、方法名后面加上尖括号&lt;&gt;,括号中可以声明一个或多个类型参数,多个类型参数之间用逗号隔开。例如: ```java public class GenericClass&lt;T&gt; { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } } public interface GenericInterface&lt;T&gt; { T getData(); void setData(T data); } public &lt;T&gt; void genericMethod(T data) { System.out.println(data); } ``` 其中,`GenericClass`是一个泛型类,`GenericInterface`是一个泛型接口,`genericMethod`是一个泛型方法。在这些声明中,`&lt;T&gt;`就是类型参数,可以用任何字母代替。 二、泛型的使用 1. 泛型类的使用 在使用泛型类时,需要在类名后面加上尖括号&lt;&gt;,并在括号中指定具体的类型参数。例如: ```java GenericClass&lt;String&gt; gc = new GenericClass&lt;&gt;(); gc.setData("Hello World"); String data = gc.getData(); ``` 在这个例子中,`GenericClass`被声明为一个泛型类,`&lt;String&gt;`指定了具体的类型参数,即`data`字段的类型为`String`,`gc`对象被创建时没有指定类型参数,因为编译器可以根据上下文自动推断出类型参数为`String`。 2. 泛型接口的使用 在使用泛型接口时,也需要在接口名后面加上尖括号&lt;&gt;,并在括号中指定具体的类型参数。例如: ```java GenericInterface&lt;String&gt; gi = new GenericInterface&lt;String&gt;() { private String data; @Override public String getData() { return data; } @Override public void setData(String data) { this.data = data; } }; gi.setData("Hello World"); String data = gi.getData(); ``` 在这个例子中,`GenericInterface`被声明为一个泛型接口,`&lt;String&gt;`指定了具体的类型参数,匿名内部类实现了该接口,并使用`String`作为类型参数。 3. 泛型方法的使用 在使用泛型方法时,需要在方法名前面加上尖括号&lt;&gt;,并在括号中指定具体的类型参数。例如: ```java genericMethod("Hello World"); ``` 在这个例子中,`genericMethod`被声明为一个泛型方法,`&lt;T&gt;`指定了类型参数,`T data`表示一个类型为`T`的参数,调用时可以传入任何类型的参数。 三、泛型的通配符 有时候,我们不知道泛型的具体类型,可以使用通配符`?`。通配符可以作为类型参数出现在方法的参数类型或返回类型中,但不能用于声明泛型类或泛型接口。例如: ```java public void printList(List&lt;?&gt; list) { for (Object obj : list) { System.out.print(obj + " "); } } ``` 在这个例子中,`printList`方法的参数类型为`List&lt;?&gt;`,表示可以接受任何类型的`List`,无论是`List&lt;String&gt;`还是`List&lt;Integer&gt;`都可以。在方法内部,使用`Object`类型来遍历`List`中的元素。 四、泛型的继承 泛型类和泛型接口可以继承或实现其他泛型类或泛型接口,可以使用子类或实现类的类型参数来替换父类或接口的类型参数。例如: ```java public class SubGenericClass&lt;T&gt; extends GenericClass&lt;T&gt; {} public class SubGenericInterface&lt;T&gt; implements GenericInterface&lt;T&gt; { private T data; @Override public T getData() { return data; } @Override public void setData(T data) { this.data = data; } } ``` 在这个例子中,`SubGenericClass`继承了`GenericClass`,并使用了相同的类型参数`T`,`SubGenericInterface`实现了`GenericInterface`,也使用了相同的类型参数`T`。 五、泛型的限定 有时候,我们需要对泛型的类型参数进行限定,使其只能是某个类或接口的子类或实现类。可以使用`extends`关键字来限定类型参数的上限,或使用`super`关键字来限定类型参数的下限。例如: ```java public class GenericClass&lt;T extends Number&gt; { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } } public interface GenericInterface&lt;T extends Comparable&lt;T&gt;&gt; { T getData(); void setData(T data); } ``` 在这个例子中,`GenericClass`的类型参数`T`被限定为`Number`的子类,`GenericInterface`的类型参数`T`被限定为实现了`Comparable`接口的类。 六、泛型的擦除 在Java中,泛型信息只存在于代码编译阶段,在编译后的字节码中会被擦除。在运行时,无法获取泛型的具体类型。例如: ```java public void genericMethod(List&lt;String&gt; list) { System.out.println(list.getClass()); } ``` 在这个例子中,`list`的类型为`List&lt;String&gt;`,但是在运行时,`getClass`返回的类型为`java.util.ArrayList`,因为泛型信息已经被擦除了。 七、泛型的类型推断 在Java 7中,引入了钻石操作符&lt;&gt;,可以使用它来省略类型参数的声明。例如: ```java List&lt;String&gt; list = new ArrayList&lt;&gt;(); ``` 在这个例子中,`ArrayList`的类型参数可以被编译器自动推断为`String`。 八、总结 Java泛型是一个强大的特性,可以提高代码的可读性和安全性,降低代码的耦合度。在使用泛型时,需要注意它的基本语法、使用方法、通配符、继承、限定、擦除和类型推断等问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值