Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка , обобщенное программирование / 14 сообщений из 14, страница 1 из 1
19.06.2014, 11:11
    #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
19.06.2014, 11:22
    #38673981
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка , обобщенное программирование
У вас три раза объявлен тип T1 и два раза объявлен тип T2.
Компилятор не даёт гарантий что T1 объявленый в одом месте, будет тот же тип, что T1 объявленый в другом месте.
Нужно всё свести к одному объявлению.

И никогда не пишите через запятую объявление переменных.
...
Рейтинг: 0 / 0
19.06.2014, 11:25
    #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
19.06.2014, 11:33
    #38674002
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка , обобщенное программирование
Теперь о решении. Основные ошибки, на сколько я понимаю две. Generic method - нафиг не нужен. Он даже не статический.
Node не может быть static.
Почему root принадлежит Node, а не Tree, тоже не совсем понятно.
...
Рейтинг: 0 / 0
19.06.2014, 11:39
    #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
19.06.2014, 11:57
    #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
19.06.2014, 11:58
    #38674062
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка , обобщенное программирование
mr_virtus,

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

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

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

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

То что надо, спасибо!
...
Рейтинг: 0 / 0
19.06.2014, 14:15
    #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
19.06.2014, 14:56
    #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
19.06.2014, 16:31
    #38674538
Psolao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка , обобщенное программирование
А мне казалось, проблема была в static который выносил класс узла наружу
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка , обобщенное программирование / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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