Могу ли я создать пользовательский объект в интерфейсе и определить его в реализующем классе?

#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, как предложено @JustAnotherDeveloper

4. @BillNaylor фактический исходный код не является псевдокодом, я просто упростил для ясности. Единственными вещами, которые я изменил, были имена объектов / методов, которые теперь кажутся избыточными. В исходном коде obj называется bit, а интерфейс — iBit и т.д. Спасибо за предложение.

5. @JustAnotherDeveloper. Могу ли я использовать дженерики без изменения исходного кода?