Java 接受不同的集合实现作为参数

Java 接受不同的集合实现作为参数,java,Java,我试图编写一个函数,能够接受这两个对象中的任何一个作为参数: private static TreeSet<String> TREESET = new TreeSet<String>(); private static HashSet<String> HASHSET = new HashSet<String>(); 及 公共静态无效打印集(集s){ // } 即使在调用时强制转换集合,我也会得到一个错误。正确的方法是什么 更新1 我试过使用和不

我试图编写一个函数,能够接受这两个对象中的任何一个作为参数:

private static TreeSet<String> TREESET = new TreeSet<String>();
private static HashSet<String> HASHSET = new HashSet<String>();

公共静态无效打印集(集s){
//
}
即使在调用时强制转换集合,我也会得到一个错误。正确的方法是什么

更新1

我试过使用和不使用铸造:

printSet(SET);
printSet((Set) SET);
printSet((Set<String> SET);
打印集(SET);
打印集((套)套);
打印集((套);
更新2

错误:

线程“main”java.lang.ClassCastException中的异常:无法在HashTreeSetClient.main(HashTreeSetClient.java:34)处将TreeSet转换为java.util.Set


就像你做的那样使用泛型

public static <T> void printSet(Set<T> s) {
  //
}
公共静态无效打印集(集s){
//
}
避免使用原始类型


或者像别人说的那样设置s

public static void printSet(Set<String> s) {
  //
}
公共静态无效打印集(集s){
//
}

Set
是一个接口,方法中接受实现此接口的每个类。

我认为您误解了
Set
接口的目的。任何实现
Set
的类都可以被视为
Set

这就是为什么这些声明是合法的:

Set<String> stringSet = new HashSet<>();
Set<String> treeSet = new TreeSet<>();
printSet(TREESET);
printSet(HASHSET);
…而且绝对不需要强制转换,因为
TreeSet
HashSet
都实现了
Set
接口

但是,集合上的泛型类型参数与方法签名匹配是非常重要的

例如,这将不起作用:

HashSet<Integer> hashSet = new HashSet<>();
printSet(hashSet); // compilation error

是一种通配符类型。它隐式扩展了
对象
,可用于接受任何作为泛型类型的对象。

您如何调用该方法?不要使用原始类型。使用
公共静态无效打印集(集)
您不会得到“错误”。您收到了一个特定的错误,其中有一条特定的错误消息,指明了问题所在。不阅读/发布此错误消息是您最大的错误。您可以与我们共享此错误吗?HashSet,TreeSet已经设置。为什么要强制设置它们?如果您知道您将只拥有一个
,我看不出不这样做的原因把它放在方法签名中。如果他更改了它怎么办?那么他违反了自己的约定。从我在OP的帖子中读到的内容来看,约定是他将拥有
Set
。如果他没有,那么使用泛型会更好。Set是一个接口:HashSet可以,TreeSet可以,ArrayList不可以。
public static void printSet(Set<String> s) {
    // logic
}
printSet(TREESET);
printSet(HASHSET);
HashSet<Integer> hashSet = new HashSet<>();
printSet(hashSet); // compilation error
public static void printSet(Set<?> s) {
    // logic
}