我有以下方法:
public <U, V> boolean isEqual(List<U> a, List<V> b) {
// check if U == V
}
Run Code Online (Sandbox Code Playgroud)
我要检查,如果U和V是同一类.
你不能因为类型擦除而这样做,就这么简单.
考虑以下:
public static void main(String[] args) {
List<? extends Number> l1 = Arrays.asList(1L, 2, 3L);
List<? extends Number> l2 = Arrays.asList(1);
isEqual(l1, l2);
}
public static <U, V> boolean isEqual(List<U> a, List<V> b) {
// is U == V here?
}
Run Code Online (Sandbox Code Playgroud)
在U == V这儿?l1包含Long和Integer实例但l2包含单个Integer实例.
我猜你的评论:
第一个条件应该是它们的类型是相同的
你应该拥有的只是一种类型U.在这种情况下,请使用以下签名:
public static <U> boolean isEqual(List<U> a, List<U> b) {
}
Run Code Online (Sandbox Code Playgroud)
并且,上面的代码将不再编译.
您还可以做的是添加2个接受类的参数:
public static <U, V> boolean isEqual(List<U> a, List<V> b, Class<U> uClass, Class<V> vClass) {
if (!uClass.equals(vClass)) {
// classes are different
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果给出的类不相同,则可以打印消息.