Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 24.09.2011
Сообщений: 66
1

Шаблоны, ограничение на тип

19.10.2012, 21:17. Показов 1321. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть класс

Java
1
2
3
class A<T>
{
}
Как сделать так, чтобы вместо T можно подавать только классы с определённым интерфейсом?


-
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2012, 21:17
Ответы с готовыми решениями:

Шаблоны - ограничить тип
How to define generic class that accept only types that extends class of your choice? Напишите...

Ограничение на тип T
{$reference Properties.dll} ///Версия Properties.dll для PascalABC.Net. unit PropertiesPascal;...

Свой тип переменной через класс, шаблоны
Задание вот такое: общая постановка. Дано: число N и последовательность (a1+1), (a2+2) , (a3+3), …,...

Ограничение на тип вводимых данных в Excel
Пожалуйста! В определенную область на листе пользователь вводит данные. Нужно, чтобы вводились...

10
2 / 2 / 0
Регистрация: 13.01.2012
Сообщений: 40
19.10.2012, 22:45 2
Java
1
class A<T extends имя_интерфейса> { }
Например
Java
1
class A<T extends Comparable> { }
Java
1
class A<T extends Comparable & Serializable> { }
0
487 / 333 / 71
Регистрация: 24.12.2011
Сообщений: 591
19.10.2012, 22:45 3
Java
1
class A<T extends InterfaceName> {}
upd уже написали
0
1 / 1 / 0
Регистрация: 24.09.2011
Сообщений: 66
20.10.2012, 13:22  [ТС] 4
Спасибо большое!

И ещё вопрос, если можно:
Почему нельзя делать так:
Java
1
2
3
4
5
6
7
8
    class A<T>
    {
       T[][] a;
       public A()
       {
          a = new T[2][2]; // Ошибка тут
       }
    }
И как решить проблему?
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
20.10.2012, 16:29 5
Java не позволяет такое делать by design.
выход - использовать другие коллекции, а не массивы
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
20.10.2012, 17:57 6
Цитата Сообщение от turbanoff Посмотреть сообщение
Java не позволяет такое делать by design.
выход - использовать другие коллекции, а не массивы
позволяет, но при этом есть некоторые трикс
предупреждение
 Комментарий модератора 
BAD PRACTICE


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
45
46
47
48
49
50
import java.util.Arrays;
 
public class GenericArray {
 
    public static void main(String[] args) {
        A<Double> a = new A<Double>(2, 2);
        a.set(0, 0, 1.0);
        a.set(1, 0, 2.0);
        a.set(0, 1, 3.0);
        a.set(1, 1, 4.0);
        System.out.println(a);
        
        A<Integer> b = new A<Integer>(2, 2);
        b.set(0, 0, 1);
        b.set(1, 0, 2);
        b.set(0, 1, 3);
        b.set(1, 1, 4);
        System.out.println(b);
 
    }
 
    static class A<E> {
        private int x;
        private int y;
        private E[][] a;
 
        @SuppressWarnings("unchecked")
        public A(int i, int j) {
            x = i;
            y = j;
            a = (E[][]) new Object[i][j];
        }
 
        public void set(int i, int j, E value) {
            a[i][j] = value;
        }
 
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder("[");
            for (int i = 0; i < x; i++) {
                for (int j = 0; j < y; j++) {
                    sb.append(Arrays.toString(a[i]));
                }
            }
            return sb.append("]").toString();
        }
 
    }
}
1
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
22.10.2012, 13:08 7
Цитата Сообщение от mutagen Посмотреть сообщение
позволяет, но при этом есть некоторые трикс

Java
1
2
3
4
5
6
7
8
9
10
11
12
static class A<E> {
 
    private E[][] a;
 
@SuppressWarnings("unchecked")
public A(int i, int j) {
    a = (E[][]) new Object[i][j];
}
 
public void set(int i, int j, E value) {
    a[i][j] = value;
}
set - это замечательно, конечно. И даже get Вы таким образом сделаете. А давайте попробуем получить строку целиком? Какого она там типа должна быть? E[]?

Java
1
2
3
public E[] getRow(int row){
    return a[row];
}
И в коде:

Java
1
Integer[] row = b.getRow(0);
Тыдыщь!

Трики - они до хорошего не доведут.

А всего лишь - нужно в сигнатуру конструктора добавить класс. И тогда всё становится существенно приятнее:

Java
1
2
3
4
5
6
@SuppressWarnings("unchecked")
public A(int i, int j, Class<E> clz) {
    x = i;
    y = j;
    a = (E[][]) java.lang.reflect.Array.newInstance(clz, i, j);
}
Это уже не трик и работает всегда. Создание же объекта меняется не сильно:

Java
1
A<Integer> b = new A<Integer>(2, 2, Integer.class);
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.10.2012, 20:57 8
Цитата Сообщение от Skipy Посмотреть сообщение
set - это замечательно, конечно. И даже get Вы таким образом сделаете. А давайте попробуем получить строку целиком? Какого она там типа должна быть? E[]?
ну на это класс вобщемто и не был рассчитан, а если бы надо было бы, реализация "тыдыща" не допускала бы
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
23.10.2012, 11:08 9
Цитата Сообщение от mutagen Посмотреть сообщение
ну на это класс вобщемто и не был рассчитан, а если бы надо было бы, реализация "тыдыща" не допускала бы
Но это знаете Вы и не знает ТС, который будет использовать этот трик везде и нарвется на "тыдыщь" тогда, когда что-то менять уже будет сложно.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
23.10.2012, 19:33 10
Цитата Сообщение от Skipy Посмотреть сообщение
и нарвется на "тыдыщь" тогда, когда что-то менять уже будет сложно.
Верно, надо было поставить мод
 Комментарий модератора 
BAD PRACTICE

поставил, чтобы неповадно было
0
turbanoff
23.10.2012, 20:04     Шаблоны, ограничение на тип
  #11

Не по теме:

Цитата Сообщение от mutagen Посмотреть сообщение
позволяет, но при этом есть некоторые трикс
Это и означает: не позволяет by design.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2012, 20:04

Шаблоны, древовидная сортировка: как правильно передавать тип в шаблонную функцию?
Реализую собственную версию древовидной сортировки на основе шаблонов. Нужно сравнение производить...

Почему перегруженные шаблоны функций должны возвращать один и тот же тип?
Так как я еще очень плохо знаю шаблоны и никак не могу понять. Почему у всех перегруженных...

Хранить шаблоны документов в базе и выводить данные в эти шаблоны
Доброго времени суток. Интересует вопрос: мне необходимо формировать вордовские документы по...

Чем отличаются шаблоны HTML и шаблоны WordPress
В чём различие между шаблонами HTML и WordPress. Кроме того, что создаются они разными способами....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru