通用编程与通用对象类型

时间:2012-10-31 09:06:37

标签: java generics object

我想知道在使用Java泛型编程实现类和将类型保持为通用Object类之间是否存在任何明显的优点/缺点?也许下面的代码澄清了我在寻找什么?

第一个代码显示了使用通用Object类类型来实现列表:

public class myList {
private static int DEFAULT_CAPACITY = 16;
private int size, capacity;
private Object[] dataArray;

myList(){
    this(DEFAULT_CAPACITY); 
}
myList(int defaultSize){
    capacity = defaultSize;
    size = 0;
    dataArray =new Object[defaultSize];
}
public int getSize(){return size;}
public void insert(int loc, Object o){
    if (size+1 <= capacity){
        for (int i=size; i> loc-1; i--)
            dataArray[i] = dataArray[i-1];
        dataArray[loc-1] = o;
        size++;
    }
}
public Object getItem(int loc){
    return dataArray[loc-1];
}
}

以下代码使用Java泛型编程显示相同的功能:

public class MyList<E> {
private int size = 0;
private static final int DEFAULT_CAPACITY = 10;
private Object dataArray[];

public MyList() {
   dataArray = new Object[DEFAULT_CAPACITY];
}

public void insert(int loc, E e) {
if (size+1 <= capacity){
   for (int i=size; i> loc-1; i--)
    dataArray[i] = dataArray[i-1];
   dataArray[loc-1] = e;
   size++;
}
}
public E get(int loc) {
   return (E) elements[loc-1];
}
} 

4 个答案:

答案 0 :(得分:3)

Generic方法的优势在于:
假设您创建了Integer的列表 使用Generic方法,如果您尝试将其他内容放入列表中,则会在编译时时出现错误。
使用Object方法,在运行时之前,您不会看到此错误,这是一个非常难以发现的错误的配方。

答案 1 :(得分:1)

首先,你的通用MyList<E>的dataArray应该是通用的。

class MyList<E> {
     private E dataArray[];
     public MyList(Class<E> c,int size) {
         dataArray  = (E[]) Array.newInstance(c,size);
    }
 }

优点 - 您的列表本质上是类型安全的意思是在一般对象类型中,您可以添加任何类型,当您进行排序等操作时可能会导致问题......

答案 2 :(得分:1)

让我为你解决这个问题...............

- Generics可以实现到类,接口,方法和字段,但最重要的用法用于使Collection 类型安全

- 这就是Collections在Java中进行类型安全的方式,因此错误的类型不会进入集合,As集合在Compilation时间内仅检查 ,在Runtime 期间 ,Cat对象不应进入成为狗的集合。

- 有一个称为Erasure的过程,编译器在编译时期间从Generics类中删除Type Parameters和Type Arguments, 运行时期间的Raw类型,以保持与WithOut Generics编写的代码的向后兼容性。

<强>例如

Box<String> 变为 Box

答案 3 :(得分:0)

重要的关键字是“按合同设计”。泛型允许您在编译之前验证合同“此列表中的元素具有此类型” - 您只需要抽象语法树。类型验证是强类型语言的主要优点。

它还使代码完成和refractorings更容易。