首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型编程与通用对象类型

泛型编程与通用对象类型
EN

Stack Overflow用户
提问于 2012-10-31 17:06:37
回答 4查看 371关注 0票数 0

我想知道使用Java泛型编程实现类和将类型保留为通用对象类之间是否有任何显著的优点/缺点?也许下面的代码澄清了我正在寻找的东西?

这第一段代码显示了如何使用通用对象类类型来实现列表:

代码语言:javascript
复制
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泛型编程展示了相同的功能:

代码语言:javascript
复制
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];
}
} 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-31 17:10:34

Generic方法的优势在于:

假设您创建了一个Integer列表。

使用Generic方法时,如果您尝试将其他内容放入列表中,将在编译时得到一个错误。

使用Object方法,您直到运行时才会看到这个错误,这是很难找到bug的秘诀。

票数 3
EN

Stack Overflow用户

发布于 2012-10-31 17:13:13

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

代码语言:javascript
复制
class MyList<E> {
     private E dataArray[];
     public MyList(Class<E> c,int size) {
         dataArray  = (E[]) Array.newInstance(c,size);
    }
 }

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-31 17:19:04

让我为你分解这件事.

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

-这就是Collections在Java语言中是如何进行类型保护的,因此错误的类型不会进入集合中,因为集合在代码时间期间只检查,而在< Compilation >D18>期间检查不是<>e217>..ie猫对象不应进入类型为Dog的集合。

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

例如:

Box<String> 成为 Box

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13154450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档