繁体   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