-1

我试图理解为什么这段代码无法编译。
我有一个实现接口的类。最后一种方法由于某种原因无法编译。

它不仅允许我将集合转换为集合,而且允许它很好地返回单个对象。

有人可以向我解释这是为什么吗?谢谢。

public class Testing2 {

    public SortedSet<ITesting> iTests = new TreeSet<ITesting>();
    public SortedSet<Testing> tests = new TreeSet<Testing>();

    public ITesting iTest = null;
    public ITesting test = new Testing();

    // Returns the implementing class as expected
    public ITesting getITesting(){
        return this.test;
    }

    // This method will not compile
    // Type mismatch: cannot convert from SortedSet<Testing> to SortedSet<ITesting>
    public SortedSet<ITesting> getITests(){
        return this.tests;
    }

}
4

4 回答 4

6

简单地说, aSortedSet<Testing> 不是a SortedSet<ITesting>。例如:

SortedSet<Testing> testing = new TreeMap<Testing>();
// Imagine if this compiled...
SortedSet<ITesting> broken = testing;
broken.add(new SomeOtherImplementationOfITesting());

现在您SortedSet<Testing>将包含一个不是Testing. 那会很糟糕。

可以做的是:

SortedSet<? extends ITesting> working = testing;

...因为那样你只能从集合中获取

所以这应该工作:

public SortedSet<? extends ITesting> getITests(){
    return this.tests;
}
于 2013-02-28T21:43:11.120 回答
1

假设ITesting是一个超类型的Testing. 泛型类型不是多态的。SortedSet<ITesting>因此不是. 多态性根本不适用于泛型类型。您可能需要使用带有下限的通配符作为返回类型。SortedSet<Testing>? extends ITesting

public SortedSet<? extends ITesting> getITests(){
    return this.tests;
} 
于 2013-02-28T21:43:27.153 回答
0

您的声明中有错字:

public SortedSet<Testing> tests = new TreeSet<Testing>();

如果您希望该方法返回 ITesting,或者您需要该方法返回,则应该在那里进行 ITesting:

SortedSet<Testing>
于 2013-02-28T21:43:17.643 回答
0

我想你想要这个:

public SortedSet<Testing> getTests(){
    return this.tests;
}

现在你正在尝试返回tests,它被声明为 aSortedSet<Testing>而不是SortedSet<ITesting>

于 2013-02-28T21:43:19.767 回答