簡體   English   中英

Java中返回通用類成員的參數化方法

[英]Parameterised method returning generic class member in java

為什么不允許以下代碼?

class MyClass {
    List<? extends Something> list;
    <T extends Something> List<T> myFunc(T t) {
        list = new ArrayList<T>(); // ok
        list.add(t); // error
        return list; // error
    }
}

以及如何在維護代碼的同時修復代碼? 即,類成員list僅接受Something子類且myFunc()相同的對象?

我認為通用<T>聲明可以在類級別完成。

據我了解,這是因為通配符? 不能用作類型參數。

通配符從不用作泛型方法調用,泛型類實例創建或超類型的類型參數。

因此,我得到的是Java將不知道<T extends Something>和列表,即使該列表具有擴展相同的上下文,也無法確保該列表具有相同的類型。

一個可能的解決方案(可能不是您想要的)將在類級別聲明Generic。

如果執行以下操作可能會起作用:

class Abc <T extends Something>{
    List<T> list;
    List<T> myFunc(T t) {
        list = new ArrayList<T>(); // ok
        list.add(t); 
        return list; 
    }
}

希望對您有所幫助。

您必須先在任何地方定義T類型參數,然后才能在任何地方使用它。 理想情況下,您應該使用類聲明進行定義。 因為您在課堂中的許多地方都使用過它。 如果T僅在方法范圍內使用,則可以使用方法簽名對其進行定義。

您不能修改上限 <T extends Something>Unbounded <?>類型的實例。

這意味着不允許將任何元素添加到List<?> (無邊界列表)中,並且List<T extends Something>

如果要使其正常工作,可以對列表使用下界類型參數。

class MyClass<T super Something> {
    List<T super Something> list;
    <T super Something> List<T> myFunc(T t) {
        list = new ArrayList<T>(); // ok
        list.add(t); 
        return list; 
    }
}

你不能做list.add(t); 因為list類型為List<? extends Something> List<? extends Something>並且t具有類型T ,並且無法知道T是否是未知類型的子類型? 代表。

同樣,您不能return list; 因為list類型為List<? extends Something> List<? extends Something> ,列表的返回類型為List<T> ,無法知道List<? extends Something> List<? extends Something>List<T>

我認為您在想的是將List<T>放入變量中,因此您知道它是List<T>然后嘗試像List<T>一樣使用它。 但這不是它的工作方式。 list類型為List<? extends Something> List<? extends Something> 無論您輸入了什么內容,都不會改變變量的類型,並且對變量的任何使用都必須基於其編譯時類型。

如果要在方法的稍后部分中使用創建為List<T>進行處理,則需要保留類型為List<T>的變量以指向該對象,如下所示:

<T extends Something> List<T> myFunc(T t) {
    List<T> tempList = new ArrayList<T>();
    list = tempList;
    tempList.add(t);
    return tempList;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM