2013-11-09 105 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

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