2017-05-31 30 views
-1

我正在进行一项调查,使用double来回答问题,但在扩展类中出现错误。子类中的double值问题

超类:

import java.io.Serializable; 

public abstract class Question implements Serializable 
{   
    protected String question; 
    protected int maxResponses; 
    protected int numResponses; 

    public Question(String q, int m) 
    { 
     question = q; 
     maxResponses = m; 
     numResponses = 0; 
    } 

    public abstract void askQuestion();  
    public abstract void displayResults();   
} 

,这里是我的扩展类,这是DoubleQuestions:

import java.util.Scanner; 

public class DoubleQuestions extends Question 
{ 
    private double[] responses; 
    public DoubleQuestions(double q, int m) 
    { 
    super(q,m); // ERROR: constructor Question in class Question cannot be applied to given types; 
    responses = new double[m]; 
    } 

    @Override 
    public void askQuestion() 
    { 
    double response;    
    Scanner input = new Scanner(System.in); 
    System.out.print(question + " "); 
    input.nextLine(); //still have to "eat" the current response   
    response = input.nextLine(); // ERROR: incompatible types 
    responses[numResponses] = response; 
    numResponses++; 
    } 
    @Override 
    public void displayResults() 
    { 
    System.out.println(question); 
    for(int i = 0; i < numResponses;i++) 
     System.out.println(responses[i]); 
    }   
    } 

错误标记为在源代码中的注释。

+1

你可以试试你收到什么错误? –

+1

Java不是Javascript。一个标签就够了。 – GhostCat

+2

对我们来说没有第23和第34行....我们需要错误信息msg –

回答

2

您的基构造函数需要一个字符串作为第一个参数。您打算使用双精度值来调用它。

但是java不会自动将double转换为字符串。

您想使用Double.toString()例如,返工这样的代码:

super(Double.toString(q), 

另一个问题:nextLine()返回一个字符串,不是一倍。因此你不能分配给双重值。

真实的答案在这里:阅读有关您正在使用的类的文档;你会发现,例如,扫描仪有一个方法nextDouble(),你可以调用。

+0

是的,就是这样。 – EJoshuaS

+2

让OP先纠正不显示错误的错误给我们。我们可以通过我们自己来发现错误,但OP应该提到这一点。 –

+0

对不起,我对这个有点新,我试图自我教,所以你可以告诉我,我应该在哪里添加, – luigi

0

你有你的参数的方法搞砸:DoubleQuestions,将其更改为:

public DoubleQuestions(String q, int m) 

记住:你必须通过相同类型的变量的情况下有类继承。

+0

我不同意 - “子”类构造函数接受与“父类”不同的参数是完全可以接受的。问题在于“超级”呼叫。 – EJoshuaS

+0

我同意你发布的方法,我只是觉得在类继承中使用相同类型的变量会更方便。它使调试更加简单高效,并帮助程序员避免不必要的类型转换。 –

1

一个错误在askQuestion方法中。您正在分配String value to avariable.

public static void main(String[] args) { 
    double response;    
    Scanner input = new Scanner(System.in); 
    System.out.print("question" + " "); 
    input.nextLine(); //still have to "eat" the current response   
    response = input.nextLine(); 
} 

看看这个double response;这是一张双人床和你分配input.nextLine(),这是String

为了解决这一:

response = input.nextDouble(); 

获取输入作为双或更改response变量的数据类型到String

而第二个错误在您的super()。因为您通过double值,并且在父类构造函数中,因此您将其作为String

子类的构造函数

public DoubleQuestions(double q, int m) 
{ 
     super(q,m); 
     responses = new double[m]; 
} 

父类的构造

public Question(String q, int m) 
{ 
    question = q; 
    maxResponses = m; 
    numResponses = 0; 
} 

为了解决这个问题,你可以重载构造函数在父类或通过qString

像这样:

super(q+"",m); 

UPDATE:

q+""拼接是最简单的一个,

但是在性能方面这是不好的,

"" + q慢作为如上所示在super()Double.toString(q)比较好。

+0

你知道如何解决这个问题吗? – luigi

+1

谢谢先生,我的代码已经解决了 – luigi