Java 对象返回类型与通用方法

2023-12-29

我看到了几个有关通用返回类型的问题,但没有一个回答我的问题。
如果任何参数都没有界限,例如以下方法JayWay https://github.com/jayway/JsonPath/blob/master/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java :

public static <T> T read(String json, String jsonPath, Filter... filters) {
    return new JsonReader().parse(json).read(jsonPath, filters);
}

使用它作为泛型有什么意义?
我告诉我团队的成员,这种方法应该用作:

JsonPath.<Boolean>read(currentRule, "$.logged")

代替:

(boolean) JsonPath.read(currentRule, "$.logged")

但我真的分不出区别...


泛型通过编译器在代码中插入不可见的强制转换来工作。

例如,在将泛型添加到语言之前,您必须执行此操作。

List list = new ArrayList();
list.add("Foo");
list.add("Bar");
String str0 = (String) list.get(0);
String str1 = (String) list.get(1);

这很烦人。因为get()Object,每次你想要获得一个时,你都必须进行投射String来自List.

如今,List是通用的,并且get()回报T,所以你可以这样做。

List<String> list = new ArrayList<>();
list.add("Foo");
list.add("Bar");
String str0 = list.get(0);
String str1 = list.get(1);

这里发生的情况是,编译器通过为您添加强制转换将新版本转换为旧版本,但它们仍然存在。

然而,泛型的全部要点在于,这些编译器生成的强制转换是保证安全- 即他们不可能扔出ClassCastException在运行时。

在我看来,如果你使用泛型来隐藏强制转换not保证安全,只是因为它们很烦人,这是对该功能的滥用。

无论它是通用方法还是你做的

Boolean a = JsonPath.<Boolean>read(currentRule, "$.logged");

或者它返回Object你也是

Boolean a = (Boolean) JsonPath.read(currentRule, "$.logged");

both版本可能会引发ClassCastException在运行时,所以我认为如果你被迫强制转换会更好,这样至少你知道你正在做一些可能会失败的事情。

我认为泛型方法的返回类型涉及类型参数是不好的做法T如果方法参数没有,unless返回的对象不能以损害类型安全的方式使用。例如,

public static <T> List<T> emptyList()

in Collections没问题(列表是空的,因此它不能包含错误类型的元素)。

就你的情况而言,我认为read方法不应该是通用的,而应该只是返回Object.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 对象返回类型与通用方法 的相关文章

随机推荐