0

我想知道在使用 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

4 回答 4

3

Generic方法的优点是:
假设您创建了一个Integer.
使用这种方法,如果您尝试将其他内容放入列表中,您将在编译时Generic收到错误消息。 使用这种方法,直到运行时才会看到此错误,这是真正难以发现的错误的秘诀。
Object

于 2012-10-31T09:10:33.640 回答
1

首先,您的 genericMyList<E>的 dataArray 应该是通用的。

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

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

于 2012-10-31T09:13:13.370 回答
1

让我为你打破这个......

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

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

-有一个过程称为,编译器在编译Erasure期间从泛型类中删除类型参数和类型参数,使其在运行时成为原始类型,以保持与编写的代码的向后兼容性没有泛型。

例如:

Box<String> 变成 Box

于 2012-10-31T09:19:04.190 回答
0

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

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

于 2012-10-31T09:48:12.367 回答