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