Java TreeSet.add() 不遵循 PECS 原则问题(泛型)

标签 java generics treeset pecs

我有以下代码:

public interface Segment<T> extends Period { ... };

public class SegmentImpl_v1<T> implements Segment<T> { ... };


public interface TimeLine<T, S extends Segment<T>> { ... };

public class TimeLineImpl<T, S extends Segment<T>>
        implements TimeLine<T, S> {

    private SortedSet<S> segments = new TreeSet<S>();

    public void someFunction() {

        // no suitable method for...
        segments.add(new SegmentImpl_v1<T>(...)); 

    }

}

在添加段实例时,我得到一个没有合适的方法...。看来Java的树集并没有应用PECS原则。这个问题有解决办法吗?

解决方案

我实现了:

public static <T> Segment<T> newItem(Period p, T itemValue) {
    return new SegmentImpl_v1(p, itemValue);
}

SegmentImpl_v1中并在someFunction()中调用它。

最佳答案

PECS 与此无关。 (您没有任何有界通配符。)

问题是SegmentImpl_v1<T>不是 S 的子类型。当您将参数传递给方法时,它必须是参数声明类型的子类型。

关于Java TreeSet.add() 不遵循 PECS 原则问题(泛型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016988/

相关文章:

java - Jackson 在序列化期间添加不存在的字段

java.lang.OutOfMemoryError 无法创建新的 native 线程

java - http : in main method - why no errors? 奇怪的行为

java - 显式类型参数可以冗余吗?

delphi - 在单元破坏调试信息中通用定义

Java 泛型 : how to declare a generic parameter as the base type of another generic parameter?

java - TreeSet 上的迭代器导致无限循环

java - 触发事件时自发的 NullPointerExceptions

java - Java TreeSet 中的给定元素处于什么级别?

java - 如何将两个HashSet分别添加到有序TreeSet中