子类中的double值问题

时间:2017-05-31 03:44:11

标签: java

我正在进行一项使用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]);
     }        
   }

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

3 个答案:

答案 0 :(得分:2)

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

但是java并没有自动将double转换为字符串。

例如,您想使用Double.toString()来重写您的代码:

super(Double.toString(q), 

另一个问题:nextLine()返回字符串,而不是双倍。因此,您无法分配双精度值。

这里真正的答案是:阅读有关您正在使用的课程的文档;例如,您会发现Scanner有一个方法nextDouble(),您可以调用它。

答案 1 :(得分:1)

您的askQuestion方法中存在一个错误。您正在指定String value to a double variable.

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

获取输入为double或将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;
}

要解决此问题,您可以重载父类中的构造函数,或将q值作为String传递。

像这样:

super(q+"",m);

<强>更新

这个q+""连接是最简单的连接,

但表现明智并不好,

"" + q速度较慢,如super()中所示。 Double.toString(q)更好。

答案 2 :(得分:0)

您在方法中弄乱了参数:DoubleQuestions,将其更改为:

public DoubleQuestions(String q, int m) 

记住:在有类继承的情况下,你必须传递相同类型的变量。