[英]Java - working with list of objects and generics
我有一段簡單的Java代碼有問題。 我無法確定它是否解決了最初的目的; 編寫該文件的人(但仍無法到達)只是告訴我“實現IA
的對象應該是類似IB
的對象的容器( List
)”。乍一看,我認為它是錯誤的,因為它的約束很強( T extends IB<T>
)似乎不合邏輯,但是IDE編譯器沒有顯示任何相關的錯誤/警告。
如果此類代碼有意義,請有人提供此類接口的實際用法示例。
提前致謝。
import java.util.List;
public interface IA<T extends IB<T>> {
public List<T> getList();
}
public interface IB<T> {
public T getValue();
}
更新1 :添加了帶有具體樣本類的測試
class Bar implements IA<Foo>{
List<Foo> list;
@Override
public List<Foo> getList() {
return list;
}
Bar(List<Foo> foos) {
this.list = foos;
}
}
class Foo implements IB<Foo> {
public Float data;
@Override
public Foo getValue() {
return foo;
}
Foo(Float data){
this.data = data;
}
public Float getV() {
return data;
}
}
public class DataTest {
@Test
public void myTest() {
Foo f = new Foo(10F);
List<Foo> fs = new ArrayList<>();
fs.add(f);
Bar bar = new Bar(fs);
List<Foo> foos = bar.getList();
System.out.println(foos.get(0).getV());
}
}
這是使用IA和IB的正確方法嗎?
由於T
僅在協變位置使用,因此按原樣使用是安全的,因此對IA
的評論可能是正確的。 如果IA
具有在其參數之一中接受T
的方法(例如int compare(T a, T b)
),則由於它處於互變位置,因此會引起問題。
在某些情況下,這樣的約束是有意義的。 例如,如果要創建排序列表類,則可以執行以下操作
class SortedList<T extends Comparable<? super T>>
需要將元素類型與自身進行比較的地方,這是對元素進行排序所必需的。 (請注意, Comparable
本身在類型參數上沒有限制,就像這里一樣。)
上面的super
是因為Comparable
是T
的使用者,因此對於每個PECS,您應該使用Comparable
super
通配符。 在您的情況下,由於IB
是T
的生產者,您可以使其成為public interface IA<T extends IB<? extends T>>
如果要使其更通用,則public interface IA<T extends IB<? extends T>>
。
至於使用此約束的實際用例,我想到的是一個使用約束的類:
class Bar<T extends IB<T>> implements IA<T> {
T start;
@Override
public List<T> getList() {
List<T> result = new ArrayList<T>();
for (T x = start; x; x = x.getValue()) {
result.add(x);
}
return result;
}
Bar(T start) {
this.start = start;
}
}
如果您有一個自己本身是通用的實現類(具有相同的<T extends IB<T>>
邊界),並且它占用一個T
並生成更多T
直到達到null
,然后返回這些列表。
盡管這仍然不要求接口IA
具有約束,所以我想它仍然沒有提供必須限制IA
參數的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.