Появляется сообщение об ошибке компиляции производного класса - PullRequest
1 голос
/ 10 мая 2019

Когда я пытаюсь скомпилировать мой производный класс IntSearchTree, появляется сообщение об ошибке

IntSearchTree.java:3: error: constructor IntBinTree in class IntBinTree
cannot be applied to given types;

IntSearchTree(int node, IntSearchTree left, IntSearchTree right) {

required: int,IntBinTree,IntBinTree

found: no arguments

reason: actual and formal argument lists differ in length

1 error

.

В следующем коде показаны наиболее важные строки базового класса:

 class IntBinTree {
   int node;
   IntBinTree left;
   IntBinTree right;

   IntBinTree(int node, IntBinTree left, IntBinTree right) {
     this.node = node;
     this.left = left;
     this.right = right;
   }
 }

И наиболее важные строки производного класса:

 class IntSearchTree extends IntBinTree {
 IntSearchTree left;
 IntSearchTree right;

   IntSearchTree(int node, IntSearchTree left, IntSearchTree right) {
     this.node = node;
     this.left = left;
     this.right = right;
   }
 }

Я попытался решить эту проблему, предоставив конструктору в базовом предложении частный модификатор

 private IntBinTree(int node, IntBinTree left, IntBinTree right) {...}

, но сообщение об ошибке компиляции было таким же.

Итак, первый вопрос: как определить конструктор таким образом, чтобы он был видим в базовом классе, но не в производных классах?

И второй вопрос: почему базовый конструктор все еще виден в производном классе, даже если я использую частный модификатор?

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Я вижу две проблемы с этой реализацией.

  1. Возможно, вы не хотите снова объявлять поля left и right в производном классе- это не вызывает ошибку компиляции, но наверняка вызовет некоторые проблемы, которые трудно отладить позже.
  2. Создание производного класса требует вызова конструктора его суперкласса - в этом случае вы можете вызвать super(node, left, right) вваш текущий конструктор, или super().Помните, что java создает по умолчанию открытый конструктор без параметров для любого создаваемого вами класса.
0 голосов
/ 10 мая 2019

Вам нужен конструктор без аргументов.

Поместите это в свой класс IntBinTree:

IntBinTree()
{
}

Или вы можете использовать это вместо этого в классе IntSearchTree:

IntSearchTree(int node, IntSearchTree left, IntSearchTree right) {
     super(node,left,right);
  }

Если в суперклассе нет конструктора без аргументов, вам необходимо явно вызвать конструктор, который вы хотите использовать в дочернем классе. Этот super () вызовет конструктор, который принимает node, left, right из IntBinTree().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...