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

时间:2016-01-22 16:25:31

标签: java generics

我有以下方法:

public <U, V> boolean isEqual(List<U> a, List<V> b) {
    // check if U == V
}

我想检查UV是否属于同一类。

6 个答案:

答案 0 :(得分:8)

你不能这样做because of type erasure,就这么简单。

请考虑以下事项:

while($row = $result->fetch_assoc()) { 
      echo 'Email <input type="hidden" name="emailtype[]" id="" value="' . $row["emailtypeID"] . '"/>'  . $row["emailtype"];
      echo '<input type="text" name="email[]" id="" /><br />';
    if($row["emailtype"] == 'secondario' || $row["emailtypeID"]==2){
        echo 'Email <input type="hidden" name="emailtype[]" id="" value="' . $row["emailtypeID"] . '"/>'  . $row["emailtype"];
         echo '<input type="text" name="email[]" id="" /><br />';
    }   

    }

这里有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? } 吗? U == V包含l1Long个实例,但Integer包含一个l2个实例。

我猜测你的评论:

  

第一个条件应该是它们的类型是相同的

你应该拥有的是单一类型Integer。在这种情况下,请使用以下签名:

U

然后,上面的代码不再编译。

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

public static <U> boolean isEqual(List<U> a, List<U> b) {

}

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

答案 1 :(得分:2)

如果您正在创建自己的课程,则可以要求Class<T>包含在构造函数中,如演示here

例如:

public class SomeClass<T> {

    private final Class<T> clazz;

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

    public Class<T> getParam() {
        return clazz;
    }
}

现在您可以调用SomeClass#getParam()来获取声明的类型参数。

还有a way to do this with reflection.

所有这些都说,你必须对此进行奇怪的解决方法是因为Type Erasure。基本上在运行时,Java将所有泛型都视为Object,因此在编译List时可能是List<Integer>List<Boolean>,但在运行时它们都是List<Object>

答案 2 :(得分:1)

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

    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;
    }

这样你就可以依靠U和V类型来正确处理equals()。以下是实施equals()的一些指导原则:http://www.javaworld.com/article/2072762/java-app-dev/object-equality.html

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

答案 3 :(得分:0)

不要依赖

a.getClass().equals(b.getClass())

这是不正确的,它只会检查两者是否为ArrayList类型而不是String,Integer等。

仅限试用

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

确保检查null条件,否则在这里会遇到NullPointerException。

答案 4 :(得分:0)

我想你想检查a == b而不是U == V.在这种情况下,你必须编写自己的比较方法来比较U类和V类的实例。

答案 5 :(得分:-1)

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

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

应该这样做。