2012-10-06 30 views
0

如果以前曾詢問過此問題,但我不知道要搜索什麼,所以我很抱歉。Java子類化通用參數

不管怎樣,我正在做一個數學包,和許多類的擴展功能:

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

} 

我想比較功能,看看他們是平等的。如果他們來自同一個類,我想使用它的特定比較方法,但是如果他們是不同的類,我想返回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; 
} 

} 

我怎樣才能做到這一點?

+1

你應該考慮的對象比較空,以避免收到'NPE' – user1406062

+0

這八九不離十看起來像http://stackoverflow.com/questions/tagged/crtp的情況下, - 你可能想看看涉及java的相關問題,如http://stackoverflow.com/questions/2165613/java-generic-type也見:http://en.wikipedia.org/wiki/Talk%3ACuriously_recurring_template_pattern –

+0

你可能只是想'公共抽象類功能' – newacct

回答

1

使用泛型,您可以保證equals方法僅適用於'T'類型,在本例中爲'Product'。你不能傳遞另一個類的類型。

另一種可能性是在CLASSE功能定義:

public abstract boolean equals(Function comparison);

而在CLASSE產品的對象比較蒙山一個comparison instanceof Product

1

覆蓋的Object.Equals(Object)方法。這裏不需要使用泛型。它的身體會是這個樣子

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

return false;