Несовместимые типы. Дробь не может быть преобразована в строку

#java

#java

Вопрос:

Я пытаюсь выполнить задание для университета. Я выполнил всю основную часть кода, и, насколько я могу судить, это должно сработать. Тем не менее, я продолжаю получать сообщение об ошибке обратно.

Я не совсем уверен, что попробовать, поскольку я думал, что это именно так и работает. Я пересмотрел свои предыдущие лекции, провел тематические чтения и обратился к своим сокурсникам. До сих пор я не получил обратно решения.

 private static Fraction fraction1;
private static Fraction fraction2;



public static void main(String[] args)
{

    String fraction1 = args[0];

    String[] splittedFraction1 = fraction1.split("/");

    String fraction2 = args[1];

    String[] splittedFraction2 = fraction2.split("/");



    int numerator1 = Integer.parseInt(splittedFraction1[0]);

    int denominator1 = Integer.parseInt(splittedFraction1[1]);

    int numerator2 = Integer.parseInt(splittedFraction2[0]);

    int denominator2 = Integer.parseInt(splittedFraction2[1]);


    fraction1 = new Fraction ( numerator1,  denominator1);

    fraction2 = new Fraction ( numerator2,  denominator2);
  

относится к


 class Fraction{
public int numerator;
public int denominator;

public Fraction( int n, int d )
{
    this.numerator = n;

    this.denominator = d;
}

public Fraction()
{
    this.numerator = 1;

    this.denominator = 2;
}
  

}

Насколько я понимаю, я ввел строку из командной строки.

Затем я разделил строку, чтобы определить входные данные, которые я хочу задать в виде целых чисел.

Затем я использовал int numerator1 = Integer.parseInt(fraction1[0]); и т. Д

чтобы преобразовать строку в целое число.

Затем, насколько я понимаю, я затем взял созданные мной целые числа и поместил их в параметры для создания моего объекта

 fraction1 = new Fraction(numerator1, denominator1);

fraction2 = new Fraction(numerator2, denominator2);
  

чтобы я мог передать их в свой класс Fraction, а затем назначить их переменным экземпляра класса.

Вместо того, чтобы все это работало, я получаю следующие ошибки:

 ArithmeticWithFractions.java:42: error: incompatible types: Fraction cannot be converted to String
                fraction1 = new Fraction ( numerator1,  denominator1);
                            ^
ArithmeticWithFractions.java:44: error: incompatible types: Fraction cannot be converted to String
                fraction2 = new Fraction ( numerator2,  denominator2);
                            ^
ArithmeticWithFractions.java:47: error: incompatible types: String cannot be converted to Fraction
                Calculator calculator = new Calculator(fraction1, fraction2);
  

Что, черт возьми, происходит?

Я думал, что преобразовал строки в целые числа с помощью parseInt .

Боже!

Комментарии:

1. Смотрите часть вашей декларации String fraction1 = args[0]; . Поскольку fraction1 и fraction2 объявлено как строка, вы не можете присвоить ему Fraction объект класса.

2. смотрите на это String fraction1 — это говорит о том, что fraction1 это Строка. Смотрите это fraction1 = new Fraction — он пытается присвоить Дробь Строке

3. Если вы хотите присвоить его переменной уровня класса, чем использовать like this.fraction1 = new Fraction ( numerator1, denominator1);

4. Это действительно плохая идея использовать одно и то же имя для двух разных переменных, которые доступны из одного и того же места. Ваша String переменная с именем fraction1 скрывает вашу Fraction переменную с именем fraction1 . Возможно, используйте разные имена для String s.

Ответ №1:

Если вы видите свой код, вы дважды объявили fraction1 и fraction2 . Одна из них является локальной переменной, которая является строковой, а другая — переменной уровня класса, которая имеет тип Fraction .

По умолчанию Java использовала переменную с наименьшей областью видимости. Итак, в вашем случае локальная переменная находится на картинке, поэтому вы получаете несовместимую ошибку.

Если вы хотите использовать переменные уровня класса, вам нужно использовать это, как показано ниже.

 ArithmeticWithFractions.fraction1 = new Fraction ( numerator1,  denominator1);
ArithmeticWithFractions.fraction2 = new Fraction ( numerator2,  denominator2);
  

И то же самое вам нужно сделать при передаче его в Calculator конструктор.

 Calculator calculator = new Calculator(ArithmeticWithFractions.fraction1, ArithmeticWithFractions.fraction2);
  

Комментарии:

1. Кажется, это сработало. Это тоже имеет смысл. Локальные переменные имеют приоритет, поэтому мне нужно было убедиться, что я работаю с переменными класса (правильно?), И я делаю это, ссылаясь на них с помощью: ArithmeticWithFractions.fraction1 = новая дробь (числитель1, знаменатель1);