Ошибка преобразования данных в универсальные классы - PullRequest
0 голосов
/ 29 мая 2018

У меня есть этот общий класс узла:

class Node<E>
    {
        private E data;
        private Node<E> link;

        public Node(E d)
        {
            data = d;
            link = null;
        }

        public Node(E d, Node<E> l)
        {
            data = d;
            link = l;
        }

        public void AddNodeAfter(E d)
        {
            link = new Node<E>(d, link);
        }
    }

И у меня есть мой основной класс с двумя строками:

Node<int> n1 = new Node<int>(100);
n1.AddNodeAfter(4.4); //error here

Строка n1.AddNodeAfter(4.4) дает мне ошибку Argument 1: cannot convert from 'double' to 'int' который я не совсем понимаю.

Насколько я знаю, последний узел содержит int в качестве data, но этот узел является общим, поэтому я предполагаю, что это не имеет значениякаким будет следующий узел, поскольку data может меняться от узла к узлу.

Но, очевидно, я что-то упускаю.Поэтому мой вопрос: почему я получаю эту ошибку преобразования в универсальном классе?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Обобщения используются для создания своего рода «шаблона» для класса, способа параметризации определенных типов, используемых классом.Node<int> по сути создает новый класс на основе Node<E>, где все E заменены на int, поэтому тип link равен Node<int> для вашего экземпляра n1.Вы также можете создавать Node<double> экземпляров, но вы просто не можете связать их вместе на основании определения вашего типа.

Если вы действительно хотите разместить любой тип объекта в вашемузлы, вам нужно иметь более гибкий тип, например Object для данных вашего узла, и использовать что-то вроде отражения, если вам нужно получить тип данных.

0 голосов
/ 29 мая 2018

Node<E> - универсальный класс, в котором нет понятия универсального объекта.new Node<int>() типизированный объект с целым числом.Он может принимать только тот тип, который может быть неявно преобразован в целое число.

см. Неявные преобразования для предопределенных типов .

0 голосов
/ 29 мая 2018

Ты ничего не пропустил.вы определили свой универсальный тип как int и передаете double в AddAfterNode метод

Ваш метод станет следующим:

 public void AddNodeAfter(int d)
 {
     link = new Node<int>(d, link);
 }

Таким образом, вы не можете передать ничего, кромеint

Если вы хотите, чтобы код работал, просто измените int на object.

Также есть лучшие способы сделать это.

...