当前位置: 首页 > 面试题库 >

如何使用“ instanceof”实现泛型的“等于”方法?

郭辉
2023-03-14
问题内容

我有一个接受 通用类型的类 ,并且我想以equals一种不尴尬的方式重写该方法(即,看起来很干净,并且代码量最少,但用于非常普通的用例)。

现在我有这样的事情:

public class SingularNode<T> {
    private T value;

    @SuppressWarnings("unchecked")
    @Override
    public boolean equals(Object other){
        if(other instanceof SingularNode<?>){
            if(((SingularNode<T>)other).value.equals(value)){
                return true;
            }
        }
        return false;
    }
}

我猜这是非常有缺陷的-我正在SingularNode<T>other对象进行强制转换,这可能会 引发错误

另一件事是-当我这样做时,if(other instanceof SingularNode<?>)我实际上并不是在检查正确的事情。我实际上想检查类型T而不是类型?。每当我尝试?进入时T,都会出现类似以下的错误:

无法对参数化类型执行instanceof检查SingularNode<T>。请改用表格SingularNode<?>,因为在运行时将删除更多的通用类型信息

我该如何解决?有T.class.isInstance(other);什么办法吗?

我想有一个非常丑陋的黑客解决方案,如下所示:

@SuppressWarnings("unchecked")
public boolean isEqualTo(Class<?> c, Object obj){
    if(c.isInstance(obj) && c.isInstance(this)){
        if(((SingularNode<T>)obj).value.equals(value)){
            return true;
        }
    }
    return false;
}

但是,使用额外的方法参数看起来确实很尴尬,并且它也不是像equalsis 这样的内置函数。

任何了解泛型的人都请解释一下吗?正如您可以清楚地看到的那样,我并不精通Java,因此请详细解释一下!


问题答案:

这个版本没有警告

public boolean equals(Object other){
    if (other instanceof SingularNode<?>){
        if ( ((SingularNode<?>)other).value.equals(value) ){
            return true;
        }
    }
    return false;
}

至于强制转换SingularNode<T>无济于事,您不能假设T只能是Object

了解有关如何使用Java编译泛型的更多信息,

https://docs.oracle.com/javase/tutorial/java/generics/erasure.html



 类似资料:
  • 问题内容: 我有课 和班级 关键是该方法不安全,因为我可以提供的项目与当前报告无关,但与其他报告相关,编译器不会抱怨。 是否可以用类型安全的方式编写该方法,即我们可以仅将T作为当前报表的类型作为参数传递。 问题答案: 我认为您正在寻找以下内容。 它的工作方式是: 您想用从 您要确保所有列表都属于同一类型 为了将参数绑定到从扩展的对象,您需要对自身进行参数化: 您添加需要从报表扩展的绑定 但是您要

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 问题内容: 鉴于: 我得到: 我还会收到关于第6行的“未经检查的演员表”警告。为什么?该是 不是 一个泛型类型- 它只是一个普通的。如何通过检查和强制转换为实例来正确实现? 注意:显然,此代码示例是我的实际代码的简化版本。真正的类和都大得多,是一个内部类的其实现中使用。 仅供参考:实数确实使用了通用参数。 问题答案: o不是通用类型-只是普通对象。 那不是问题。问题…和两个编译错误的根本原因…是泛

  • 问题内容: 我有一个像这样的通用接口: 此接口具有有限的实例,因此最好将它们实现为枚举值。问题是那些实例具有不同类型的值,因此我尝试了以下方法,但无法编译: 有什么想法吗? 问题答案: 你不能 Java不允许在枚举常量上使用泛型类型。但是,它们允许用于枚举类型: 在这种情况下,你可以做的是为每个泛型类型都拥有一个枚举类型,或者通过将其设为一个类来“伪造”一个枚举: 不幸的是,它们都有缺点。

  • 问题内容: 实现与Java等效的C ++的首选方法是什么? 问题答案: 尝试使用: 这要求你的编译器启用rtti支持。 编辑:我对这个答案有很好的评论! 每次需要使用dynamic_cast(或instanceof)时,最好问问自己是否必要。通常,这是不良设计的标志。 典型的解决方法是将要检查的类的特殊行为放入基类的虚函数中,或者引入诸如访问者之类的东西,你可以在不更改接口的情况下为子类引入特定行

  • 和函数类似,实现(implementation)也需要关注保持泛型。(原文:Similar to functions, implementations require care to remain generic.) struct S; // 具体类型 `S` struct GenericVal<T>(T,); // 泛型类型 `GenericVal` // GenericVal 的实现,此处我们