簡體   English   中英

Java-使用對象和泛型列表

[英]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是因為ComparableT的使用者,因此對於每個PECS,您應該使用Comparable super通配符。 在您的情況下,由於IBT的生產者,您可以使其成為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.

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