泛型的工作原理是编译器将不可见的强制转换插入到代码中。
例如,在将泛型添加到语言之前,您必须执行此操作。
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
在我看来,如果你使用泛型来隐藏不能保证安全的投射,仅仅因为它们很烦人,那就是滥用这个功能。
无论是通用方法,你做
Boolean a = JsonPath.<Boolean>read(currentRule, "$.logged");
或者它返回,你做Object
Boolean a = (Boolean) JsonPath.read(currentRule, "$.logged");
这两个版本都可以在运行时抛出,所以我认为如果你被迫投射会更好,这样至少你知道你正在做一些可能失败的事情。ClassCastException
我认为,如果方法参数不涉及类型参数,则泛型方法的返回类型类型是不好的做法,除非返回的对象不能以损害类型安全的方式使用。例如T
public static <T> List<T> emptyList()
in 是可以的(列表是空的,所以它不能包含错误类型的元素)。Collections
在你的情况下,我认为该方法不应该是通用的,而应该只返回。read
Object