我想知道在使用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];
}
}
答案 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更容易。