#java #object #interface #jgrasp
#java #объект #интерфейс #jgrasp
Вопрос:
У меня есть исходный код интерфейса, для которого я должен создать класс. Интерфейс включает пользовательский объект, который объявлен только в интерфейсе и должен быть переопределен и определен в моем собственном классе. Мой класс позже используется в отдельном файле с main для вызова его методов.
исходный код (псевдокод):
package folder1.subfolder;
public interface IObj {
void setVal(int val);
int getVal();
obj someFunc(obj obj2);
obj anotherFunc();
...
}
Мне нужно написать класс, который должен определять obj, используемый в объявлениях методов в IObj (я знаю, что obj следует писать с заглавной буквы, но именно так это было указано в исходном коде). Файл класса помещается в ту же папку, которая содержит folder1, и у меня нет никаких ошибок при импорте пакета.
Мой класс (псевдокод):
import folder.subfolder.*;
public class obj implements IObj {
private int objValue;
obj(int val) {
objValue = val;
}
obj() {
objValue = 0;
}
@Override
public void setVal(int val) {
this.objValue = val;
}
@Override
public int getVal() {
return this.objValue;
}
@Override
public obj someFunc(obj obj2) {
//perform logic on this obj and obj2, return as new obj
}
@Override
public obj anotherFunc() {
//perform logic on this obj, return as new obj
}
...
}
У меня нет никаких ошибок с деталями методов класса, но я надеюсь, что это дает представление о том, как я пытаюсь использовать интерфейс в моем классе.
Когда я пытаюсь скомпилировать свой класс, я получаю это сообщение:
IObj.java:9: error: cannot find symbol
obj someFunc(**obj** obj2);
symbol: class obj
location: interface IObj
Я предполагаю, что это как-то связано с тем, что объект не является распознанным типом (например, int или float). Я попытался включить все файлы в проект (я использую jGRASP), трижды проверить местоположение файла и импортировать код, включая интерфейс в моем файле класса (скорее последняя попытка), и рассмотрел возможность перехода к IObj в моих конструкторах obj (хотя я не уверен, что это тоже сработает).
Мне интересно, был ли у компилятора способ игнорировать объект в интерфейсе, как он определен в моем классе, или я пропустил шаг в определении объекта в моем классе, который вызывает ошибку, или, может быть, другой подход, который я еще не рассматривал! В этом случае я не могу изменить исходный код, поэтому я ищу способ реализовать исходный код другим способом. Я ценю любые предложения!
Комментарии:
1. Я думаю, что вам было бы полезно использовать здесь дженерики.
2. Похоже, что компилятор не может найти тип
obj
в интерфейсеIObj
.3. Я думаю, что проблема, с которой вы столкнулись здесь, заключается в том, что интерфейс
IObj
задан в псевдокоде, как в комментариях, которые вы даете. Для расширения вашего класса требуется его определение, однако оно зависит от определения вашего класса. Немного ситуация с курицей и яйцом. Итак, либо используйте Object в качестве типа вIObj
, либо используйте generics, как предложено @JustAnotherDeveloper4. @BillNaylor фактический исходный код не является псевдокодом, я просто упростил для ясности. Единственными вещами, которые я изменил, были имена объектов / методов, которые теперь кажутся избыточными. В исходном коде obj называется bit, а интерфейс — iBit и т.д. Спасибо за предложение.
5. @JustAnotherDeveloper. Могу ли я использовать дженерики без изменения исходного кода?