Java子类化泛型参数

Java子类化泛型参数,java,generics,inheritance,abstract,Java,Generics,Inheritance,Abstract,如果以前有人问过这个问题,我很抱歉,但我真的不知道该搜索什么 无论如何,我正在制作一个数学软件包,其中许多类扩展了函数: package CustomMath; @SuppressWarnings("rawtypes") public abstract class Function <T extends Function> { public abstract Function getDerivative(); public abstract String toS

如果以前有人问过这个问题,我很抱歉,但我真的不知道该搜索什么

无论如何,我正在制作一个数学软件包,其中许多类扩展了函数:

package CustomMath;

@SuppressWarnings("rawtypes")
public abstract class Function <T extends Function> {

    public abstract Function getDerivative();

    public abstract String toString();

    public abstract Function simplify();

    public abstract boolean equals(T comparison);

}
package-CustomMath;
@抑制警告(“原始类型”)
公共抽象类函数{
公共抽象函数getDerivative();
公共抽象字符串toString();
公共抽象函数simplify();
公共抽象布尔等于(T比较);
}
我想比较函数,看看它们是否相等。如果它们来自同一个类,我想使用它的特定比较方法,但是如果它们来自不同的类,我想返回false。以下是我目前的课程之一:

package CustomMath;

public class Product extends Function <Product> {

public Function multiplicand1;
public Function multiplicand2;

public Product(Function multiplicand1, Function multiplicand2)
{
    this.multiplicand1 = multiplicand1;
    this.multiplicand2 = multiplicand2;
}

public Function getDerivative() {
    return new Sum(new Product(multiplicand1, multiplicand2.getDerivative()), new Product(multiplicand2, multiplicand1.getDerivative()));
}

public String toString() {
    if(multiplicand1.equals(new RationalLong(-1, 1)))
        return String.format("-(%s)", multiplicand2.toString());
    return String.format("(%s)*(%s)", multiplicand1.toString(), multiplicand2.toString());
}

public Function simplify() {
    multiplicand1 = multiplicand1.simplify();
    multiplicand2 = multiplicand2.simplify();
    if(multiplicand1.equals(new One()))
        return multiplicand2;
    if(multiplicand2.equals(new One()))
        return multiplicand1;
    if(multiplicand1.equals(new Zero()) || multiplicand2.equals(new Zero()))
        return new Zero();
    if(multiplicand2.equals(new RationalLong(-1, 1))) //if one of the multiplicands is -1, make it first, so that we can print "-" instead of "-1"
    {
        if(!multiplicand1.equals(new RationalLong(-1, 1))) // if they're both -1, don't bother switching
        {
            Function temp = multiplicand1;
            multiplicand1 = multiplicand2;
            multiplicand2 = temp;
        }
    }
    return this;
}

public boolean equals(Product comparison) {
    if((multiplicand1.equals(comparison.multiplicand1) && multiplicand2.equals(comparison.multiplicand2)) || 
            (multiplicand1.equals(comparison.multiplicand2) && multiplicand2.equals(comparison.multiplicand1)))
        return true;
    return false;
}

}
package-CustomMath;
公共类产品扩展功能{
公共职能乘数1;
公共职能乘数2;
公共产品(函数被乘数1、函数被乘数2)
{
this.被乘数1=被乘数1;
this.被乘数2=被乘数2;
}
公共函数{
返回新的和(新乘积(被乘数1,被乘数2.getDerivative()),新乘积(被乘数2,被乘数1.getDerivative());
}
公共字符串toString(){
if(被乘数1.equals(新的配给(-1,1)))
返回String.format(“-(%s)”,multipleand2.toString();
返回String.format((%s)*(%s)”,被乘数1.toString(),被乘数2.toString();
}
公共职能简化{
被乘数1=被乘数1.simplify();
被乘数2=被乘数2.simplify();
if(被乘数1.equals(新的一个()))
返回被乘数2;
if(被乘数2.equals(新的一个())
返回被乘数1;
if(被乘数1.equals(新零())| |被乘数2.equals(新零())
返回新的零();
if(被乘数2.equals(new-RationalLong(-1,1))//如果其中一个被乘数为-1,则首先将其设为-1,以便我们可以打印“-”而不是“-1”
{
如果(!multipliand1.equals(new-RationalLong(-1,1))//如果它们都是-1,就不用麻烦切换了
{
函数temp=被乘数1;
被乘数1=被乘数2;
被乘数2=温度;
}
}
归还这个;
}
公共布尔等于(乘积比较){
如果((被乘数1.equals(比较被乘数1)和&被乘数2.equals(比较被乘数2))|
(被乘数1.equals(比较被乘数2)和&被乘数2.equals(比较被乘数1)))
返回true;
返回false;
}
}

我如何才能做到这一点?

对于generic,您可以保证equals方法仅适用于类型“T”,在本例中为“Product”。无法传递其他类类型

另一种可能是在classe函数中定义:

公共抽象布尔等于(函数比较)

在classe Product中,使用Product的比较实例覆盖object.equals(object)方法的对象比较。这里不需要使用泛型。它的身体看起来像这样

if (other instanceof Product) {
    Product product = (Product) other;
    // Do your magic here
}

return false;

您应该考虑将一个对象和null进行比较,以避免得到
NPE
这类类似的情况-您可能想看看涉及java的相关问题,如:您可能只需要
公共抽象类函数