一 为什么需要泛型
在面向对象编程语言中多态算是一种泛型但是多态一般的做法是把子类赋给其基类以此实现灵活性更高的代码 但是受限于Java的单继承机制代码的灵活性并不能得到多大的提高于是设计模式中推荐的法则是面向接口编程可是问题还是没有得到很好的解决因为即使是面向接口编程对于设计类库这种需求在某种程度上来说还是太过苛刻了(试想一下如果你需要写一个容器类但是容器里面的元素要求实现某个特定的接口这样是不是会变得有点麻烦)泛型是Java SE的一个新特性凭借泛型java实现了参数化类型的概念
对比一下以下代码:
public class GenericTest {
private Object a;
public GenericTest(Object a)
{
thisa = a;
}
public Object getA() {
return a;
}
public void setA(Object a) {
thisa = a;
}
public static void main(String[] args)
{
GenericTest g = new GenericTest();
String str = (String)ggetA(); ①
gsetA(); ②
Integer x = (Integer) ggetA();
}
}
public class GenericTest <T> {
private T a;
public GenericTest(T a)
{
thisa = a;
}
public T getA() {
return a;
}
public void setA(T a) {
thisa = a;
}
public static void main(String[] args)
{
GenericTest<String> g = new GenericTest<String>();
String str = ggetA(); ①
// 编译时错误
gsetA() ②
}
}
从两段程序的①可以看出使用泛型之后我们不再需要做类型的转换因为编译器会帮你处理一切细节从程序的②可以看出当我们使用泛型之后编译器会自动进行类型检查
所以使用泛型之后我们可以得到更方便更安全的代码
二泛型接口
泛型也可以应用于接口简单的例子如下
public interface GenericInterface <T> {
T next();
}
public class GenericTest implements GenericInterface<Integer> {
private int[] a;
private int size;
private int pos = ;
private int addPos = ;
public GenericTest(int sz)
{
thissize = sz;
a = new int[sz];
}
public Integer next()
{
if ( pos > addPos )
{
pos = ;
}
return a[pos++];
}
public boolean hasNext()
{
return !(pos == addPos);
}
public boolean add(int value)
{
if ( addPos >= size )
{
return false;
}
else
{
a[addPos++] = value;
return true;
}
}
public int getSize() {
return size;
}
}
public class GenericTest implements GenericInterface<String> {
private String[] a;
private int size;
private int pos = ;
private int addPos = ;
public GenericTest(int sz)
{
thissize = sz;
a = new String[sz];
}
public String next()
{
if ( pos > addPos )
{
pos = ;
}
return a[pos++];
}
public boolean hasNext()
{
return !(pos == addPos);
}
public boolean add(String value)
{
if ( addPos >= size )
{
return false;
}
else
{
a[addPos++] = value;
return true;
}
}
public int getSize() {
return size;
}
}
public class GenericTest {
public static void main(String[] args)
{
GenericTest g = new GenericTest();
GenericTest g = new GenericTest();
String[] values = abcdefghijklsplit();
for (int i = ; i < ggetSize(); i++)
{
gadd(i);
}
for (int i = ; i < ggetSize(); i++)
{
gadd(values[i]);
}
while(ghasNext())
{
Systemoutprintln(gnext());
}
while(ghasNext())
{
Systemoutprintln(gnext());
}
}
}
这里需要注意一点基本类型不能作为泛型的类型参数GenericTest里面的元素为int但是参数需要用Integer