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