![](/img/trans.png)
[英]Apache Spark having Dataset of a parameterised/generic class in 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.