java - 带有通配符泛型的列表集作为方法中的参数

标签 java generics

我需要将一些对象(具有不同类型)的一组列表传递给一个函数,但它不起作用。有人可以解决问题吗?
代码示例:

public class Main {
    public static void main(String[] args) {
        Set<String> set = Set.of("1");
        print(set); //ok

        Set<List<String>> setOfList = Set.of(List.of("1"));
        print2(setOfList); //doesn't work
    }

    static void print(Set<? extends CharSequence> set) {
        System.out.println(set);
    }

    private static void print2(Set<List<? extends CharSequence>> setOfList) {
        System.out.println(setOfList);
    }
}

最佳答案

还为集合元素添加上限:

Set<? extends List<? extends CharSequence>>

原因是您可以添加任何 List<? extends CharSequence>Set<List<? extends CharSequence>> .例如,您可以添加 List<StringBuilder> .

private static void print2(Set<List<? extends CharSequence>> setOfList) {
    setOfList.add(List.of(new StringBuilder());
}

如果您被允许调用来自 main 的方法,你会得到一个 ClassCastException如果你做了这样的事情:

Set<List<String>> setOfList = Set.of(List.of("1"));
print2(setOfList); // pretend it works...

for (List<String> list : setOfList) {
  String s = list.get(0);  // ClassCastException, it's a CharBuffer.
}

通过制作Set<? extends List<? extends CharSequence>> ,您不能向 null 添加任何内容(文字 Set 除外) .

关于java - 带有通配符泛型的列表集作为方法中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52334304/

相关文章:

java - 使用 Java 泛型的多个绑定(bind)类型定义接口(interface)

Java:为什么不能代表+128?

java - picasso + RxJava2 : Method call should happen from the main thread

C#:替代 GenericType == null

java - 不兼容的类型推断类型不符合等式约束

c# - 将数据表转换为列表<T>

java - BufferedReader 不读取整个在线 XML 文件

java - Hibernate - 如何创建 pojos 列表?

java - 如何用 Java 创建 AVI 电影?

java - 将通用集合转换为函数参数