【问题标题】:calling specific methods of generic types in ny equals() method在 ny equals() 方法中调用泛型类型的特定方法
【发布时间】:2012-09-21 04:31:03
【问题描述】:

我正在为我正在编写的稀疏矩阵类(学校项目的一部分)研究 equals() 方法。我经常遇到这样的问题,它不允许我使用任何特定于我的类的方法或其他成员,因为that(我用于equals 的参数的名称)必须是泛型类型@ 987654323@ 以覆盖Objectsequals() 方法。除此之外,我还需要能够使用我的 SparseMatrix 类型参数的一些方法来真正比较相等性,除非我也能弄清楚。我该如何编写它来绕过这个障碍?

我有一些想法,但它们似乎都不起作用:我尝试过转换参数,我尝试过覆盖equals(),我什至尝试过其他一些东西,但没有一个它似乎有效。

这是我目前所拥有的,但正如我所说,我无法让它发挥作用。

public boolean equals(Object that) {
    if (that instanceof SparseMatrix<?>) { 
        if (this.xSize != that.xSize ||
                this.ySize != that.ySize)
            return false;
        /* make some more comparisons that depend on specific
         * members of my matrix class, etc...*/
    }
    return false;
}

我已经尝试过搜索这个,虽然我能够找到一些似乎在问同样事情的人,但我找不到任何真正解释如何这样做的答案.

【问题讨论】:

    标签: java casting polymorphism equals


    【解决方案1】:

    当你有一个基类的对象并且你知道它是哪种子类时,你可以通过向下转换来转换它。然后你可以调用任何特定于子类的方法。

    public boolean equals(Object o) {
        if (o instanceof SparseMatrix<?>) { 
            SparseMatrix that = (SparseMatrix)o;  // <-- downcast
            if (this.xSize != that.xSize ||
                    this.ySize != that.ySize)
                return false;
        }
        return false;
    }
    

    如果o 不是 SparseMatrix 的实例或扩展/实现 SparseMatrix 的类(您已经检查过,但假设您没有检查过),您会得到 ClassCastException。

    【讨论】:

    • 另外,我将如何确保o 的元素属于我需要的类型,以便调用它们的成员函数?
    • 如果(稀疏矩阵的实例)?您还可以在从 SparseMatrix 获取成员后检查类型并对其进行向下转换。
    • @Philipp 当我尝试它时,它给了我一个新错误:Cannot perform instanceof check against parameterized type SparseMatrix&lt;type&gt;. Use the form SparseMatrix&lt;?&gt; instead since further generic type information will be erased at runtime
    • @AJMansfield.. 如果你想检查你正在使用的泛型参数化类型,你需要使用Reflection API... 另见ParameterizedType
    【解决方案2】:
    public boolean equals(Object that) {
        if (that !=null && that instanceof SparseMatrix<?>) { 
            SparseMatrix that = (SparshMatrix)o;
            if (this.xSize != that.xSize ||
                    this.ySize != that.ySize)
                return false;
        }
        return false;
    }
    

    添加了检查 null 值的代码。

    你需要在你想要compare的类中有这个方法overrided。当你在那个类的实例上实际调用equals时,这个被覆盖的方法将被调用..

    ** 移自评论:- 使用instanceof,您只能确定您的实例是什么类型,而不是该实例的参数化类型..(您无法确定您是否有@ 987654327@,你可以查到是ArrayList或者ArrayList&lt;?&gt;准确的说)..原因是generic type的信息只能在compile time得到,通过type erasure被抹去,所以它们在运行时不可用..

    【讨论】:

    • 如果thatnull 它不会通过instanceof 测试,它将返回false。测试一下:String s = null; if (s instanceof Objec) { System.out.println("object"); } else { System.out.println("null"); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2020-12-20
    • 2011-05-18
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多