2015-05-10 3 views
1

Я думал, что сделал это раньше, возможно, это было на C++. Вот ситуация.Передача абстрактного класса как параметра в java

public abstract class SuperClass 
{ 
    public methodname (SuperClass superc) 
    { 
     // do stuff 
    } 
} 

public class SubClass extends SuperClass 
{ 
} 

Если я называю это, я получаю сообщение об ошибке

SubClass subc1 = new SubClass(); 
SubClass subc2 = new SubClass(); 

subc1.methodname (subc2); 

Он говорит мне, что не существует метод, называемый "MethodName (SubClass)". Он не хочет использовать часть SuperClass в SubClass и передать ее в параметре «имя метода (SuperClass)». Но если я удалю «абстрактное» ключевое слово, проблем нет.

Предоставляет ли java абстрактные классы в параметре?

+1

Ваш метод не имеет типа возврата –

+1

Ну, одна проблема заключается в том, что ваш метод methodname не имеет типа возврата. Это остановило бы класс от компиляции вообще. Вы имеете в виду «public void methodname (SuperClass superc)». Кроме того, похоже, вы пытаетесь определить два открытых внешних класса в одном файле. Java не позволит вам это сделать, вам нужно сделать отдельный файл или изменить видимость классов. – Vincent

+0

Да, я думаю, что я ошибся. Но, возможно, это была аналогичная проблема, потому что сегодня я просто добавил «абстрактный» к моему базовому классу, и это не дает мне никаких ошибок. Я думал, что проблема была в параметре, потому что он сказал что-то вроде «не может использовать methodname (подкласс) с именем метода (суперкласс)» – larienna

ответ

3

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

public class Foo { 
    public static void main(String[] args) { 
     SubClass subc1 = new SubClass(); 
     SubClass subc2 = new SubClass(); 
     subc1.methodname (subc2); 
    } 
} 

abstract class SuperClass 
{ 
    public void methodname (SuperClass superc) 
    { 
     System.out.println("do stuff"); 
    } 
} 

class SubClass extends SuperClass 
{ 
} 

с суперкласса и подкласса сделал непубличный, поэтому я могу втиснуть все в один файл. Я предполагаю, что у вас были эти классы в разных файлах, так как суперкласс и подкласс являются общедоступными. Когда я компилирую и запускаю его:

C:\Users\ndh>%JAVA_HOME%\bin\javac Foo.java 

C:\Users\ndh>java Foo 
do stuff 

все работает нормально.

Когда я первый скомпилированный исходный код, который я получил эту ошибку:

C:\Users\ndh>%JAVA_HOME%\bin\javac Foo.java 
Foo.java:12: error: invalid method declaration; return type required 
    public methodname (SuperClass superc) 
     ^
1 error 

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

Возможно, вы используете IDE, которая создает менее ясное сообщение об ошибке?

+0

Я думаю, что я ошибся в коде выше. Но это могло быть аналогичной проблемой, поскольку я только что добавил «абстрактный» к моему суперклассу, и он работает. В настоящее время я использую eclipse. – larienna