Ошибка с Generics в конструкторе Java не может быть применена к заданным типам

Я работаю над домашним заданием, поэтому я просто хочу исправить ошибку компиляции, чтобы продолжить работу над ней. Мне нужно создать класс PointList, который хранит список объектов Point в ArrayList. Класс PointList должен принимать любой объект, являющийся экземпляром класса Point или его подклассом.

Я продолжаю получать ошибку компилятора, которая говорит

> required: Point<Integer>
  found: no arguments
  reason: actual and formal argument lists differ in length
  where E is a type-variable:
  E extends Object declared in class PointList

Я действительно не понимаю, чего мне не хватает. Я просмотрел книгу и, похоже, не понимаю, почему я получаю эту ошибку. У меня есть класс Point, и я выполнил тест, но, похоже, не могу его скомпилировать.

public class PointListTest{

public static void main(String[] args){

//create point ints
Point<Integer> pointOne = new Point<Integer>(1,2);
Point<Integer> pointTwo = new Point<Integer>(3,4);
Point<Integer> pointThree = new Point<Integer>(5,6);

//make object PointList pointlist for int
PointList<Point<Integer>> newPointList = new PointList<Point<Integer>>();

//add points to list
newPointList.add(pointOne);
newPointList.add(pointTwo);
newPointList.add(pointThree);

Это то, что у меня есть для PointList

public class PointList<E>{

   private ArrayList<Point> myPoint;

   E data;

   public PointList(E obj){

      ArrayList<Point> myPoint = new ArrayList<Point>();

      data = obj;

   }

}

Класс точки

public class Point<T extends Number>{

//field values
private T xCordinate;
private T yCordinate;

//constructor
//@param x the x cordinate
//@param y the y cordinate
public Point(T x, T y){
   xCordinate = x;
   yCordinate = y;
}//end constructor

public void setX(T x){

   xCordinate = x;

}//end setX

public void setY(T y){

   yCordinate = y;

}//end setY

public T getX(){

   return xCordinate;

}//end getX

public T getY(){

   return yCordinate;

}//end getY

}//end pointlist

Если бы я мог просто скомпилировать его, чтобы продолжить работу над ним, я был бы очень благодарен.

Привет! добро пожаловать в СО! мы можем увидеть ваш точечный объект? и почему ваш объект PointList использует метод .add()?

arjayosma 19.02.2019 04:05

Спасибо, я думаю, что у моего класса Point нет проблем, но я опубликую его на всякий случай. В какой-то момент у меня был метод добавления в моем классе PointList, но я удалил его. Я ломаю голову над этим с утра.

Dan Erv 19.02.2019 04:10

Ваш конструктор PointList требует, чтобы у вас был аргумент. Обратите внимание, что при создании экземпляра объекта PointList вы не передавали никаких данных. Я предлагаю вам пройтись по вашему объекту PointList, проверить оттуда и сказать мне, что вы думаете. Другое дело, для вашего класса PointList используйте преимущества наследования. PointList<E> расширяет список<E>

arjayosma 19.02.2019 04:14

Если я использую что-то вроде этого PointList newPointList = new PointList(pointOne); Он работает, но не использует дженерики для создания экземпляра объекта. Я думал, что если бы я использовал <Point<Integer>>, он также передал бы точечный объект? Разве это не так?

Dan Erv 19.02.2019 04:21

Нет, он не передает объект Point. Он просто объявляет, что может принимать общий тип этого определенного объекта.

arjayosma 19.02.2019 04:23

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

Dan Erv 19.02.2019 04:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
305
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш PointList имеет единственный конструктор с одним аргументом:

public PointList(E obj){

      ArrayList<Point> myPoint = new ArrayList<Point>();

      data = obj;

}

Но вы пытаетесь вызвать конструктор с нулевыми аргументами:

PointList<Point<Integer>> newPointList = new PointList<Point<Integer>>();

Таким образом, компилятор не может найти соответствующий. См. руководство по Предоставление конструкторов для ваших классов и Перегрузка конструктора в Java.

Ответ принят как подходящий

Для списка точек

// Take advantage of inheritance
public class PointList<E> extends ArrayList<E> {
   // This object will now have the methods
}

использование

// If you're using Java 8 onwards, you may not need to specify the type upon instantiation
PointList<Point<Integer>> pointList = new PointList<>();
pointList.add(new Point<Integer>(x, y));

Если вы хотите использовать свой собственный PointList

public class PointList<E> {
   private List<E> dataList;

   public PointList() {
      dataList = new ArrayList<>();
   }

   public void add(E obj) {
      dataList.add(obj);
   }
}

Как упоминалось в одном из комментариев, кажется, что есть несоответствие с вашим конструктором и созданием вашего объекта.

Спасибо, я добавил конструктор без аргументов! Теперь мне просто нужно выяснить, как распечатать значения массива, а не адрес памяти. Кажется, я не могу заставить работать расширения ArrayList<E>, чтобы я мог использовать метод toString. Я получаю сообщение об ошибке: добавить (E#1) в PointList невозможно реализовать добавление (E#2) в список. Что это обозначает?

Dan Erv 19.02.2019 05:11

Если вы хотите создать собственную реализацию add() в расширенном списке PointList, вы можете сделать следующее: @Override public boolean add(E e) { return super.add(e); }

arjayosma 19.02.2019 06:22

Другие вопросы по теме