比较Java中的两种泛型类型?

Mah*_*afy 5 java generics

我有以下方法:

public <U, V> boolean isEqual(List<U> a, List<V> b) {
    // check if U == V
}
Run Code Online (Sandbox Code Playgroud)

我要检查,如果UV是同一类.

Tun*_*aki 8

你不能因为类型擦除而这样做,就这么简单.

考虑以下:

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包含LongInteger实例但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)

在这种情况下,如果给出的类不相同,则可以打印消息.