泛型通过编译器在代码中插入不可见的强制转换来工作。
例如,在将泛型添加到语言之前,您必须执行此操作。
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
.