2016-01-05 5 views
-4

У меня есть простой класс, который выглядит примерно так:Java говорит, что у меня есть недопустимый аргумент, но я не думаю, что так

class Foo{ 
    float value; 

    Foo(float value){ 
     value = value; 
    } 

    Foo(Bar b){ 
     value = b.value; 
    } 
} 

Я пытаюсь создать экземпляр класса, передавая поплавок конструктор:

Foo f = new Foo(100f); 

, и это дает мне ошибку:

Static Error: No constructor in Foo matches this invocation 
    Arguments: (float) 
    Expected return type: Foo 
    Candidate signatures: 
     Foo(float) 
     Foo(Bar) 

недопустимый аргумент вызова Foo(float), но llowed invocations: Foo(Float)? Какие?

В чем причина этой ошибки?

+2

Если ява думает так, я бы сказал, это должно быть правильным. Вы вызываете этот конструктор из другого пакета? Причина состоит в том, что отсутствующее ключевое слово 'public' или' private' в вашем объявлении contructor делает его закрытым. – SomeJavaGuy

+7

Ну, 'значение = значение;' должно быть 'this.value = value;' –

+2

странно, похоже, это работает для меня, какую версию java вы используете? – dubes

ответ

1

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

Результат будет выглядеть так:

public class Foo { 
float value; 

public Foo(float value) { 
    this.value = value; 
} 

public Foo(Bar b){ 
    value = b.value; 
} 
} 
+0

Я создал конструкторов публично, и это сработало! – Caketray

+0

Я думаю, что это было потому, что я создавал классы из командной строки DrJava, у которых не было доступа к пакету – Caketray

+1

, так как он менял его на публичную работу (ну, должно быть, возникло другое сообщение об ошибке), я бы подумал, другой IDE для целей тестирования. – SomeJavaGuy

Смежные вопросы