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

比较Java中的两种泛型类型?,java,generics,Java,Generics,我有以下方法: public <U, V> boolean isEqual(List<U> a, List<V> b) { // check if U == V } 公共布尔值相等(列表a、列表b){ //检查U==V } 我想检查U和V是否属于同一类。不要依赖于 a.getClass().equals(b.getClass()) 这是不正确的,它只会检查两者是否都是ArrayList类型,而不是String、Integer等类型 只试试这个 a

我有以下方法:

public <U, V> boolean isEqual(List<U> a, List<V> b) {
    // check if U == V
}
公共布尔值相等(列表a、列表b){
//检查U==V
}
我想检查
U
V
是否属于同一类。

不要依赖于

a.getClass().equals(b.getClass())
这是不正确的,它只会检查两者是否都是ArrayList类型,而不是String、Integer等类型

只试试这个

a.get(0).getClass().equals(b.get(0).getClass())
确保选中空条件,否则您将在此处遇到NullPointerException。

您不能这样做,就是这么简单

考虑以下几点:

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?
}
这样,上面的代码就不会再编译了


您还可以添加两个接受类的参数:

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
    }
}
publicstaticbooleaniesequal(列表a、列表b、类uClass、类vClass){
如果(!uClass.equals(vClass)){
//班级不同
}
}

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

假设a和b不为null且不为空

a.get(0).getClass().equals(b.get(0).getClass())

应该这样做。

如果您正在创建自己的类,您可以要求将
包含在构造函数中,如所示

例:

公共类SomeClass{
私人期末班;
公共课(课堂){
this.clazz=clazz;
}
公共类getParam(){
回击声;
}
}
现在可以调用
SomeClass#getParam()
来声明类型param


还有



所有这些都说明了,你之所以要做奇怪的工作是因为。基本上,Java在运行时将所有泛型都视为
对象
,因此在编译
列表
时,可能是
列表
列表
,但是在运行时,它们都是
List
我想您应该检查a==b而不是U==V。在这种情况下,您必须编写自己的比较方法来比较类U和V的实例。

如果您试图比较两个列表的内容,那么您不应该自己实现类型比较。相反,您应该这样做:

    public static <U, V> boolean isEqual(List<U> a, List<V> b) {
        if (a.size() != b.size()) 
            return false;
        for (int i = 0; i < a.size(); i++)
            if (!a.get(i).equals(b.get(i)))
                return false;
        return true;
    }
publicstaticbooleaniesequal(列表a、列表b){
如果(a.size()!=b.size())
返回false;
对于(int i=0;i
这样,您就依赖于U和V类型来正确处理equals()。下面是关于实现equals()的一些指导原则:


我猜你想做的是能够在类型不同的情况下快速返回。但是通过我给您的实现,您将得到相同的行为——您将在第一次迭代时返回。

为什么要这样做?你的用例是什么?为什么不创建另一个具有单一类型
U
的方法呢?如果
U
?扩展某些内容
U==V
是什么意思?我正在创建一个方法来测试两个对象的相等性。第一个条件应该是他们的类型是sameI,我不明白这是为了什么。你能详细说明一下你想要实现什么吗?我想创建一个方法来比较两个具有泛型类型的对象。如果两个泛型类型不相同,我想告诉用户这条消息“您的泛型类型不相同”。然后我将继续比较这两个方法的对象。我想让用户能够灵活地发送两种不同的类型,并且我想告诉他它们不相等。这是比较两个列表中第一个元素的运行时类型,不是列表本身的类型参数。这与什么不同?这是比较列表的第一个元素的运行时类型,而不是列表的参数。如果一个列表包含一个
整数,而另一个列表包含一个
双整数,则两个
列表将不相等。此外,如果
列表
列表
首先都包含一个
Double
,则它们是相等的。我想让用户能够灵活地发送两种不同的类型,并且我想告诉他它们是不相等的。@MahmoudHanafy不幸的是,这是你无法做到的。@Mahmoud与其让他们灵活地发送两种不同类型的邮件,你说这是一个错误,你想告诉他们,为什么不让他们首先发送不同类型的邮件呢?
public class SomeClass<T> {

    private final Class<T> clazz;

    public SomeClass(Class<T> clazz) {
        this.clazz = clazz;
    }

    public Class<T> getParam() {
        return clazz;
    }
}
    public static <U, V> boolean isEqual(List<U> a, List<V> b) {
        if (a.size() != b.size()) 
            return false;
        for (int i = 0; i < a.size(); i++)
            if (!a.get(i).equals(b.get(i)))
                return false;
        return true;
    }