我是Java新手并为通用链接列表编写方法,该方法接受另一个链接列表作为参数。据我了解,这个新的链表应该与调用该方法的链接列表的类型相同。
所以,而不是
public void insertList(MyLinkedList<AnyType> otherList, int idx) {
我应该指定otherList的类型来匹配调用insertList()的列表?
list.insertList(MyLinkedList<???>, 0);
如果我不知道列表的类型,我该怎么做呢,因为它是通用的,但是知道otherList需要是同一类型的吗?我希望这是有道理的。正如我所提到的,我是Java的新手,所以如果我误解了泛型,请纠正我。谢谢。
答案 0 :(得分:1)
我推断你正在编写自己的链表,而你的声明看起来像这样:
class MyLinkedList<T> {
…
如果是这样,<T>
表示您的类具有泛型类型变量T
,表示列表元素的类型。
鉴于此,insert方法看起来像这样:
void insertList(List<? extends T> list, int index) {
/* Count links to find the insertion point */
/* Remember the link that used to follow */
…
for(T obj : list) {
/* Create link for obj and link it to previous */
/* Update previous */
…
}
/* Attach the old link you remembered to previous */
…
}
此处,? extends T
表示您接受任何扩展列表的泛型类型的内容。
无需要求插入元素的集合为MyLinkedList
,甚至List
- 它可以是您可以迭代的任何类型的集合。
答案 1 :(得分:0)
根据我的理解你已经起诉传递给函数的对象将是一个LinkedList,即使你不知道你可以使用'instanceof'测试对象是否是某种类型的实例,在你之后可以利用“强制转换”资源将一般对象“转换”为另一种类型。 请使用以下代码并根据您的需要进行调整。
public static void main(String[] args) {
List<Banana> lista = new LinkedList<Banana>();
testingAndCastingSomeObject(lista);
}
/**
* This method will receive a generic object and test if it is a LinkedList, if it is it will cast the object "transforming" it in a LinkedList
* Afte this I can make what I want
* @param object
*/
static void testingAndCastingSomeObject(Object object) {
LinkedList<?> test = null;
if(object instanceof LinkedList<?>) {
test = (LinkedList<?>) object;
}
//If the List is not empty and the first objetct is a Banana I can cast it too
if(!test.isEmpty() && test.get(0) instanceof Banana ) {
Banana banana = (Banana) test.get(0);
System.out.println("Here is my banana: " +banana);
}
}
public class Banana{
//Banana members and methods
}