[英]Code reuse without generics
假设我需要创建3个链接列表,一个用于int,一个用于Strings,一个用于其他类型的自定义对象。 如果我使用的是泛型,只需创建一个链接列表即可轻松实现,但是如果我不使用泛型,是否可以避免3次编写相同的重复代码?
如果您使用Integer
而不是int
,那么可以。 在这种情况下,所有三个对象都是Object
子类,因此您的Linked List类只能处理Object
。
该代码大致如下所示:
class MyLinkedList{
public void add(Object){...}
public Object remove(Object){...}
...
}
在Java 1.5中引入泛型之前,Collections都使用Object类型,因此您将拥有一个Objects链表。 然后,您必须确保自己要添加,检索和转换正确的类型。
我看不到为什么不应该或不应该使用泛型的任何原因,因为不再需要或不建议使用Java 1.4。
您不能对ints vs Strings使用相同的代码,但是假设您的意思是Integers,则必须创建一个存储java.lang.Objects的LinkedList,顺便说一句,这是基于通用的LinkedLists所做的。
您可以将链表处理的类型抽象为您自己的类型,例如StringOrIntOrCustom
,该类型具有每种类型之一,并带有一个标志,该标志指定要使用的有效类型。 但是,您需要进行大量检查,以确保您没有在每次使用此数据类型时都执行该类型不支持的操作。
您可以在没有泛型的情况下完成此操作,但是您将无需进行编译时类型安全检查,而必须手动添加所有类型转换。
但是话又说回来,您将基本上执行使用泛型时编译器的工作。 现在,它只是容易出错和手动的。
是的,您可以做到,而且并不难。
abstract class ListNode {
public ListNode next_;
};
interface ListNodeFactory {
public ListNode createListNode();
}
然后,您创建一个操作ListNode对象的List
类。 当需要一个新的ListNode时,它将调用一个函数来创建一个新的ListNode。 add
方法将使用ListNodeFactory
参数。 我建议大多数方法都应protected
因为不是派生类的任何客户端都不可能使用它。
您将为每种类型从List
创建一个派生类。 您将必须使用一种采用所需类型的方法来包装每个方法。 您还必须创建一个ListNodeFactory
实现,该实现将创建具有适当类型的新列表节点。 为了获取数据,它还必须将从遍历或删除中获取的ListNode
对象转换为适当的类型。 这是一个例子:
class IntListNode extends ListNode {
public int data_;
public IntListNode(int x) {
data_ = x;
}
}
class IntListNodeFactory implements ListNodeFactory {
IntListNodeFactory() {
nextdataset_ = false;
}
IntListNodeFactory(int x) {
nextdataset_ = true;
data_ = x;
}
void setNextData(int x) {
nextdataset_ = true;
nextdata_ = x;
}
public ListNode createListNode() {
if (!nextdataset_) {
throw Exception("Tried to create a node with no data!");
} else {
ListNode result = new IntListNode(data_);
nextdataset_ = false;
return result;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.