powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка , обобщенное программирование
14 сообщений из 14, страница 1 из 1
Ошибка , обобщенное программирование
    #38673966
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Подскажите, пожалуйста, как правильно написать ограничение при использовании обобщенного типа

В моем варианте ругается на 2 строки:

Node<T1, T2> x = root, y = null; //Incompatible types
root = newNode;//Incompatible types

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
class BSTree<T1 extends Comparable<T1>, T2>{
    static class Node<T1 extends Comparable<T1>, T2> {
        T1 key;
        T2 value;
        Node<T1, T2> left, right;
 
        Node(T1 key, T2 value) {
            this.key = key;
            this.value = value;
        }
 
        private Node<T1, T2> root = null;
 
        public <T1 extends Comparable<T1>> void add(T1 k, T2 v) {
            Node<T1, T2> x = root, y = null; //ошибка
            while (x != null) {
                int cmp = k.compareTo(x.key);
                if (cmp == 0) {
                    x.value = v;
                    return;
                } else {
                    y = x;
                    if (cmp < 0) {
                        x = x.left;
                    } else {
                        x = x.right;
                    }
                }
            }
            Node<T1, T2> newNode = new Node<T1, T2>(k, v);
            if (y == null) {
                root = newNode; //ошибка
            } else {
                if (k.compareTo(y.key) < 0) {
                    y.left = newNode;
                } else {
                    y.right = newNode;
                }
            }
        }
    }
}



Спасибо
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38673981
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас три раза объявлен тип T1 и два раза объявлен тип T2.
Компилятор не даёт гарантий что T1 объявленый в одом месте, будет тот же тип, что T1 объявленый в другом месте.
Нужно всё свести к одному объявлению.

И никогда не пишите через запятую объявление переменных.
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38673987
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы вам было понятнее, вот ваш код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
class BSTree<T1A extends Comparable<T1A>, T2A>{
    static class Node<T1B extends Comparable<T1B>, T2B> {
        T1B key;
        T2B value;
        Node<T1B, T2B> left, right;

        Node(T1B key, T2B value) {
            this.key = key;
            this.value = value;
        }

        private Node<T1B, T2B> root = null;

        public <T1C extends Comparable<T1C>> void add(T1C k, T2B v) {
            Node<T1C, T2B> x = root, y = null; //ошибка
            while (x != null) {
                int cmp = k.compareTo(x.key);
                if (cmp == 0) {
                    x.value = v;
                    return;
                } else {
                    y = x;
                    if (cmp < 0) {
                        x = x.left;
                    } else {
                        x = x.right;
                    }
                }
            }
            Node<T1C, T2B> newNode = new Node<T1C, T2B>(k, v);
            if (y == null) {
                root = newNode; //ошибка
            } else {
                if (k.compareTo(y.key) < 0) {
                    y.left = newNode;
                } else {
                    y.right = newNode;
                }
            }
        }
    }
}


И приводите ошибки полностью, а то надо взять, скопилировать и посмотреть, только потому что вам лень скопировать всю инфу об ошибке.
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674002
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь о решении. Основные ошибки, на сколько я понимаю две. Generic method - нафиг не нужен. Он даже не статический.
Node не может быть static.
Почему root принадлежит Node, а не Tree, тоже не совсем понятно.
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674016
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Спасибо.

Изначально я написал так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
class BSTree<T1 extends Comparable<T1>, T2>{
    static class Node<T1, T2> {
        T1 key;
        T2 value;
        Node<T1, T2> left, right;

        Node(T1 key, T2 value) {
            this.key = key;
            this.value = value;
        }

        private Node<T1, T2> root = null;

        public void add(T1 k, T2 v) {
            Node<T1, T2> x = root, y = null;
            while (x != null) {
                int cmp = k.compareTo(x.key); //ошибка
                if (cmp == 0) {
                    x.value = v;
                    return;
                } else {
                    y = x;
                    if (cmp < 0) {
                        x = x.left;
                    } else {
                        x = x.right;
                    }
                }
            }
            Node<T1, T2> newNode = new Node<T1, T2>(k, v);
            if (y == null) {
                root = newNode;
            } else {
                if (k.compareTo(y.key) < 0) { //ошибка
                    y.left = newNode;
                } else {
                    y.right = newNode;
                }
            }
        }
    }
}



В таком варианте он ругается, что не знает метод compareTo:

Error:(82, 28) java: cannot find symbol
symbol: method compareTo(T1)
location: variable k of type T1


Потом, я сделал метод generic. другие ошибки появились.

Про root - типа Node. Корень тоже узел, я так понимаю
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674056
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus,
и так компилирется:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
class BSTree<T1 extends Comparable<T1>, T2>{
        class Node<T1A, T2A> { //тут поменял на Т1А, T2A
        T1 key;
        T2 value;
        Node<T1, T2> left, right;

        Node(T1 key, T2 value) {
            this.key = key;
            this.value = value;
        }

        private Node<T1, T2> root = null;

        public void add(T1 k, T2 v) {
            Node<T1, T2> x = root, y = null;
            while (x != null) {
                int cmp = k.compareTo(x.key);
                if (cmp == 0) {
                    x.value = v;
                    return;
                } else {
                    y = x;
                    if (cmp < 0) {
                        x = x.left;
                    } else {
                        x = x.right;
                    }
                }
            }
            Node<T1, T2> newNode = new Node<T1, T2>(k, v);
            if (y == null) {
                root = newNode;
            } else {
                if (k.compareTo(y.key) < 0) {
                    y.left = newNode;
                } else {
                    y.right = newNode;
                }
            }
        }
    }
}



Я так понимаю, я сказал тут компилятору, что класс Node принимает другие параметры, чем класс BSTree, хотя обозначил поля класса Node как T1, T2. И стало работать. Почему?

класс дерево, который хранить связанные узелки. Узел - состоит из ключа, указателя на левого сына, указателя на правого сына, значения. И чтоб ключ и значения были генерик.
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674062
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus,

Вот такая вообще у меня задача:

создать
класс дерево, который хранить связанные узелки. Узел - состоит из ключа, указателя на левого сына, указателя на правого сына, значения. И чтоб ключ и значения были генерик.
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674068
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите TreeMap. Ваш случай. Есть корень. Есть компаратор. Есть Entry.
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674074
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Ну да, кстати.

Спасибо за идею. Попробую!
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674079
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674090
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

То что надо, спасибо!
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674338
Psolao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите пожалуйста, если класс узла объявить приватным и сделать так то все бы заработало?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class BSTree<T1 extends Comparable<T1>, T2>{
    private class Node{
        T1 key;
        T2 value;
        Node;
 
        public Node(T1 key, T2 value) {
            this.key = key;
            this.value = value;
        }
}
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674415
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Psolao,

работает так.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
class BSTree<T1 extends Comparable<T1>, T2>{

    class Node<T1, T2> {
        T1 key;
        T2 value;
        Node<T1, T2> left, right;

        Node(T1 key, T2 value) {
            this.key = key;
            this.value = value;
        }
    }



    private Node<T1, T2> root = null;

    public void add(T1 k, T2 v) {
        Node<T1, T2> x = root, y = null;
        while (x != null) {
            int cmp = k.compareTo(x.key);
            if (cmp == 0) {
                x.value = v;
                return;
            } else {
                y = x;
                if (cmp < 0) {
                    x = x.left;
                } else {
                    x = x.right;
                }
            }
        }
        Node<T1, T2> newNode = new Node<T1, T2>(k, v);
        if (y == null) {
            root = newNode;
        } else {
            if (k.compareTo(y.key) < 0) {
                y.left = newNode;
            } else {
                y.right = newNode;
            }
        }
    }




Blazkowicz точно сделал замечание на счет:

"
Generic method - нафиг не нужен. Он даже не статический.
Почему root принадлежит Node, а не Tree, тоже не совсем понятно.
"

Это я изменил и ошибки все пропали.

private я думаю здесь особой роли не играет. обращаемся мы к этому внутреннему классу из его внешнего.
...
Рейтинг: 0 / 0
Ошибка , обобщенное программирование
    #38674538
Psolao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне казалось, проблема была в static который выносил класс узла наружу
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка , обобщенное программирование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]