Почему я не могу получить доступ к участнику?

#java #class-members

#java #члены класса

Вопрос:

Я определил следующий класс:

 public static class Solution{
   ....
}
  

В решении класса я определил два внутренних класса:

 public static class Solution{
   public static class Node{
     int id;
     public double x;
     public double y;
   }
   public static class Tree<Node>{
     Node root;
     boolean contains(Node n){
         if (n == null)
            return false;
        if (n.x == root.x amp;amp; n.y == root.y)
            return true;
        else
            return ....; //something else
   }
}
  

Проблема в том, что я не могу получить доступ к y и x полям объектов n и root и я не понимаю, почему?
РЕДАКТИРОВАТЬ: я не могу отделить класс Node, потому что я пишу его для Top Coder и мне нужно отправить только один класс; Поля x и y заданы как общедоступные, но я все равно не могу получить к ним доступ.

Комментарии:

1. Вы также можете сделать одну вещь. Определите класс Node вне класса Solution, а затем попробуйте, работает ли он.

2. Вы пробовали Tree<Solution.Node> и Solution.Node root; ? Не видя ваш импорт (который вы не включили), я не могу убедиться, что вы не импортируете другой Node класс.

3. Также можно попробовать import Solution.Node; , хотя я не могу проверить наверняка.

Ответ №1:

Потому что вы скрываете Node класс с помощью универсального Node (здесь: Tree<Node> ).

 <T extends Node>
  

Таким образом, он знает, что расширяет узел, который вы ему передаете (и знает, что у него есть x и т.д.)

Комментарии:

1. Это не имеет смысла. Куда они должны быть помещены T extends Node ? Что T собираюсь делать?

2. Это общее название, T — это общее название для дженериков. T скажет «каждый класс, который расширяет Node», поэтому Node в порядке. Пожалуйста, прочитайте: docs.oracle.com/javase/tutorial/java/generics Помните, что внутри <> вы объявляете имя универсального элемента, А НЕ ТИП!

3. Я понимаю, что такое дженерики. Я не понимаю, как они помогут с проблемой OP.

4. Я считаю, что это правильный ответ. Если OP заменит public static class Tree<Node> на public static class Tree<N> , я бы предположил, что это было бы более очевидно.

5. Потому что в общих чертах ваш код в основном говорит, что In class Tree, there is an unknown type 'Node' (not related to your previous class definition). он ни на чем не основан, так что это обычный родительский элемент Object . Теперь предполагается, что объекты, передаваемые вашему contains методу, являются Objects , следовательно, не имеют x or y . Ответ Марко говорит вам о том, что вам нужно определить тип T (который заменяет Node ), который основан на a Node , чтобы передаваемые объекты имели общего предка Node , таким образом предоставляя вам доступ к x и y .