2013-11-09 112 views
0
import java.util.*; 
class Poly{ 
    protected int[] coef = new int[1001]; 
    protected int[] exp = new int[1001]; 
    protected int len; 
    protected void attach(int c, int e){ 
     coef[len] = c; 
     exp[len++] = e; 
    } 
    protected void print() { 
     for (int i=0; i<len; i++) 
      System.out.print(coef[i]+" "+exp[i]+" "); 
     System.out.println(); 
    } 
} 
class Add extends Poly{ 
    protected Add add(Add y) { 
     int i,j; 
     Add rel = new Add(); 
     for(i=0, j=0; i<len && j<y.len;) { 
      if(exp[i] < y.exp[j]) { 
       rel.attach(y.coef[j], y.exp[j]); 
       j++; 
      } else if(exp[i] > y.exp[j]) { 
       rel.attach(coef[i], exp[i]); 
       i++; 
      } else{ 
       int c = coef[i] + y.coef[j]; 
       if(c != 0) 
        rel.attach(c,exp[i]); 
       i++; 
       j++; 
      } 
     } 
     while(i < len) 
      rel.attach(coef[i], exp[i++]); 
     while (j < y.len) 
      rel.attach(y.coef[j], y.exp[j++]); 
     return rel; 
    } 
} 
class Mul extends Add{ 
    protected Add mul(Add y){ 
     Mul sum = new Mul();  //the following error has been solved by change this 
           //Mul to Add , why? 
     for(int i=0;i<len;i++){ 
      Mul tmp = new Mul(); 
      for(int j=0; j<y.len; j++) 
       tmp.attach(coef[i]*y.coef[j], exp[i]+y.exp[j]);   
      sum = sum.add(tmp); //there are an error here 
           //incompatible types 
           //required : Mul 
           //found : Add 
     } 
     return sum; 
    } 
} 
public class answer{ 
    public static void main(String[] argv){ 
     Mul d = new Mul(); 
     Mul e = new Mul(); 
     d.attach(6,4); 
     d.attach(7,2); 
     d.attach(2,1); 
     d.attach(8,0);  
     e.attach(9,5); 
     e.attach(3,2); 
     e.attach(-1,1); 
     e.attach(5,0);  
     System.out.println("Mul");  
     System.out.println("D(x)= 9 5 3 2 -1 1 5 0"); 
     System.out.println("E(x)= 6 4 7 2 2 1 8 0"); 
     System.out.print("F(x)="); 
     d.mul(e).print(); 
    } 
} 

這是一個簡單BigInt樣品,我練我的延伸概念,java「不兼容類型」的原因?

有課堂Mul的一個錯誤:當我改變了Mul sum = new Mul(); to添加總和

sum = sum.add(tmp); 
     ^
incompatible types 
required : Mul 
found : Add 

我解決了這個問題=新在相同的Mul類中添加();`, 。

它爲什麼可以運行?爲什麼我不能使用原始代碼Mul sum = new Mul()

這個問題,我在Google搜索過的時候總是說如何解決,但是我想知道這個概念。

請問,這是我第一次用英語提問,如果您發現任何冒犯的話,請原諒。

謝謝

+0

看起來您並不需要子類'Poly':'mul'和'add'方法都對來自基類,所以看起來你可以將整個層次結構「扁平化」成一個類「Poly」,而不會丟失任何功能。 – dasblinkenlight

回答

1

Add.add方法返回類Add的對象。您正嘗試將此對象的引用分配給類型爲Mul的變量mul。這是不允許的,因爲Add不是Mul的子類。 (實際上,MulAdd的一個子類,但這是無關緊要的。)

+0

謝謝你回答我!我明白。 –

1

的問題是,add方法聲明爲返回Add - 但你試圖返回的值賦給Mul類型的變量。這是無效的。如果將sum的聲明類型更改爲Add而不是mul,那麼即使初始化sum的值爲Mul以開始使用,該分配也可以。

如果從分配分離出來的方法調用回sum這可能是更清楚你:

Mul sum = new Mul(); 
Mul tmp = new Mul(); 
... 
Add result = sum.add(tmp); 
sum = result; // This is the bit that's invalid 

這不是真的清楚你想在這裏實現什麼,但我很可疑Mul類延伸Add開始...

+0

謝謝你回答我!我明白。 –