gpt4 book ai didi

java - 如何处理 Collection 中返回类型的泛型类型

转载 作者:行者123 更新时间:2023-12-01 17:49:58 25 4
gpt4 key购买 nike

我有一个情况,我必须根据条件返回两种不同类型的列表。但总是失败

public class App {

public static void main(String[] args) {
System.out.println(getData(true, Integer.class));
}

public static <E> List<E> getData(Boolean isLe, Class<E> clazz) {
return isLe ? Arrays.asList(20) : Arrays.asList("test");
}
}

错误:

Error:(18, 36) java: incompatible types: bad type in conditional expression
inference variable T has incompatible bounds
equality constraints: E
lower bounds: java.lang.Integer

如何解决这个问题?

最佳答案

您不需要提供类来返回具有特定类型的通用列表,但如果您希望它返回所需的类型,则需要使用目标的推断:

@SuppressWarnings("unchecked")
public static <T> List<T> getData(Boolean isLe) {
return isLe ? (List<T>)Arrays.asList(20) : (List<T>)Arrays.asList("test");
}

并使用它:

List<Integer> data = getData(true);

或:

System.out.println(getData(true);

但是此代码也破坏了通用安全性,因为客户端可能在目标中提供不兼容的类型:

List<Integer> data = getData(false); 
// you will get a List of String that is stored in a List of Integer

所以你的要求似乎不一致。
客户端应该决定列表的通用类型,或者您调用的方法应该决定。但不是两者兼而有之。
仅当类型派生自公共(public)基类时,您的逻辑才有意义。在这种情况下,使用这个基类的通用列表就足够了。
例如:

public static List<Number> getData(Boolean isLe) {
return isLe ? Arrays.asList(20) : Arrays.asList(15F);
}

你可以这样称呼:

List<Number> data = getData(false);

在您的情况下,该方法可能返回数字或字符串,因此您应该使用它们的基类作为泛型类型:Object:

public static List<Object> getData(Boolean isLe) {
return isLe ? Arrays.asList(20) : Arrays.asList(15F);
}

并调用它:

List<Object> data = getData(false);

但是现在,使用通过 Object 键入的通用列表有什么优势?
没有人会像您一样通过在客户端代码中添加 downcast 来对列表的元素使用特定方法来完成。

关于java - 如何处理 Collection 中返回类型的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51442043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com