Java 第一次使用Apache Commons时,HashBag.uniqueSet()返回了错误的对象类型?

Java 第一次使用Apache Commons时,HashBag.uniqueSet()返回了错误的对象类型?,java,apache-commons,Java,Apache Commons,我第一次使用ApacheCommons,主要是因为我想访问他们的HashBag类。我将概述我所遵循的帮助查明问题的整个过程 首先,我下载了Apache Commons集合的当前版本3.2.1。 然后,我将commons-collections-3.2.1.jar文件提取到磁盘上的一个文件夹中,并将该文件夹添加到我的系统%CLASSPATH%环境变量中,以便将类导入到Java程序中 这个测试程序说明了我遇到的问题 import org.apache.commons.collections.bag

我第一次使用ApacheCommons,主要是因为我想访问他们的HashBag类。我将概述我所遵循的帮助查明问题的整个过程

首先,我下载了Apache Commons集合的当前版本3.2.1。

然后,我将commons-collections-3.2.1.jar文件提取到磁盘上的一个文件夹中,并将该文件夹添加到我的系统%CLASSPATH%环境变量中,以便将类导入到Java程序中

这个测试程序说明了我遇到的问题

import org.apache.commons.collections.bag.HashBag;

public class test {
    public static void main(String[] args) {
        HashBag test = new HashBag();
        System.out.println(test.getClass().getName());
        System.out.println(test.uniqueSet().getClass().getName());
    }
}
第一行输出是org.apache.commons.collections.bag.HashBag,这是预期的

第二行输出是org.apache.commons.collections.set.UnmodifiableSet,这是不需要的。根据文档,uniqueSet方法从超类和接口继承,但在这两种情况下,该方法都应该返回java.util.Set。为什么它在这里返回了一些不同的东西


谢谢

根本没有问题,org.apache.commons.collections.set.UnmodifiableSet实现java.util.set

具有给定return语句的函数可以返回指定类的后代。否则,就不可能使用接口和抽象类作为返回类型


这就是OOP的精髓:

根本没有问题,org.apache.commons.collections.set.UnmodifiableSet实现了java.util.set

具有给定return语句的函数可以返回指定类的后代。否则,就不可能使用接口和抽象类作为返回类型


这就是OOP的精髓:

org.apache.commons.collections.set.UnmodifiableSet实现了java.util.set,所以一切看起来都正常。方法必须返回隐藏在接口下的具体实现

org.apache.commons.collections.set.UnmodifiableSet实现java.util.set,因此一切看起来都正常。方法必须返回隐藏在接口下的具体实现

这是有道理的,谢谢。但对我来说,真正的问题是我想将返回的集强制转换为哈希集,它不允许我,因为它是不可修改的。不,不。这不是因为它是不可修改的!为什么要将其转换为HashSet?比起一个简单的集合,它能为你提供更多什么?HashSet是一个实现。您不应该将代码与实现绑定在一起,在适当的地方使用接口。因此,如果您必须强制转换为HashSet,因为您希望从函数返回HashSet,那么应该设置返回类型,而不是HashSet…但是方法的契约规定,它应该返回一个不可修改的集:@111您的主要问题是使用一个特定的类。Java不是这样工作的。OOP中最好的东西是编程到接口,而不是实现类。最后,您应该使用一个集合而不是实现着色面的类。@LuiggiMendoza是对的,也许他的话比我的话更清楚一些……这是有道理的,谢谢。但对我来说,真正的问题是我想将返回的集强制转换为哈希集,它不允许我,因为它是不可修改的。不,不。这不是因为它是不可修改的!为什么要将其转换为HashSet?比起一个简单的集合,它能为你提供更多什么?HashSet是一个实现。您不应该将代码与实现绑定在一起,在适当的地方使用接口。因此,如果您必须强制转换为HashSet,因为您希望从函数返回HashSet,那么应该设置返回类型,而不是HashSet…但是方法的契约规定,它应该返回一个不可修改的集:@111您的主要问题是使用一个特定的类。Java不是这样工作的。OOP中最好的东西是编程到接口,而不是实现类。最后,你应该使用一个集合,而不是实现着色面的类。@LuiggiMendoza是对的,也许他的话比我的要清楚一点。。。