假设我需要为int创建3个链表,一个用于Strings,一个用于不同类型的自定义对象。如果我使用泛型,只需创建一个链表就可以很容易地做到这一点,但如果我不使用泛型,有没有办法避免写3次相同的重复代码?
答案 0 :(得分:2)
如果您使用Integer
代替int
,那么是。在这种情况下,所有三个对象都是Object
的子类,因此您的Linked List类可以处理Object
s。
代码看起来大致如下:
class MyLinkedList{
public void add(Object){...}
public Object remove(Object){...}
...
}
答案 1 :(得分:1)
在Java 1.5中引入泛型之前,集合都使用了Object类型,因此您将拥有一个对象的链接列表。然后,您必须确保自己正在添加,检索和转换正确的类型。
我认为你不应该或不会使用泛型的任何理由因为几乎不需要或推荐使用Java 1.4。
答案 2 :(得分:0)
你不能使用相同的代码进行整数和字符串,但假设你的意思是整数,那么你必须创建一个存储java.lang.Objects的LinkedList,顺便说一下,这是基于泛型的LinkedLists。
答案 3 :(得分:0)
您可以将链接列表处理的类型抽象为您自己的类型,例如StringOrIntOrCustom
,具有每种类型之一,以及指定哪一个是要使用的有效类型的标志。但是,您需要进行大量检查,以确保在使用此数据类型时,您不会执行类型不支持的操作。
答案 4 :(得分:0)
你可以使用泛型来完成它,但你没有编译时类型安全检查,你必须手动添加所有类型转换。
但是,当你使用泛型时,你基本上会做编译器所做的事情。现在它只是容易出错和手动。
答案 5 :(得分:0)
是的,你可以做到这一点,并不是那么难。
abstract class ListNode {
public ListNode next_;
};
interface ListNodeFactory {
public ListNode createListNode();
}
然后创建一个操作ListNode对象的List
类。它将具有一个函数,它在需要时创建一个新的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;
}
}
}