使用泛型参数的Java方法?

时间:2017-09-15 20:15:00

标签: java generics

我是Java新手并为通用链接列表编写方法,该方法接受另一个链接列表作为参数。据我了解,这个新的链表应该与调用该方法的链接列表的类型相同。

所以,而不是

public void insertList(MyLinkedList<AnyType> otherList, int idx) {

我应该指定otherList的类型来匹配调用insertList()的列表?

list.insertList(MyLinkedList<???>, 0);

如果我不知道列表的类型,我该怎么做呢,因为它是通用的,但是知道otherList需要是同一类型的吗?我希望这是有道理的。正如我所提到的,我是Java的新手,所以如果我误解了泛型,请纠正我。谢谢。

2 个答案:

答案 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
    }