powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Снова про дженерики
11 сообщений из 11, страница 1 из 1
Снова про дженерики
    #39840652
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Почему нет ошибки в реализации metodA в MyClass1? Ведь необходимо указать использование дженерика.
Правильно ли реализован metodA в классе MyClass2 или криво?
Код: java
1.
2.
3.
4.
5.
public interface MyInterface {

    <T> void metodA(List<T> objectList);
    
}

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MyClass1<T> implements MyInterface {
    
    private List<T> objectList;

    @Override
    public void metodA(List objectList) {
        this.objectList = objectList;
    }

}

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MyClass2<T> implements MyInterface {
    
    private List<T> objectList;

    @Override
    public <V> void metodA(List<V> objectList) {
        this.objectList = (List<T>) objectList;
    }

}
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840683
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВедь необходимо указать использование дженерика.

Зачем?

Странно, что он на второй класс не ругается, т.к. что может означать конструкция " <V> void" я вообще не представляю.
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840693
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что метод ничего не возвращает. Значит просто void. Imho
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840702
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Generic methods это "отдельная песня" в мире генериков. Это generic на уровне метода, а не на уровне классов/интерфейсов.

Пример с потолка.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Utils {
    
    public static <T> T findBean(ApplicationContext applicationContext, Class<T> requiredClass) {
        return applicationContext.getBean(requiredClass);
    }

    public static void main(String[] args) {
        ApplicationContext applicationContext = ...;
        // тут никаких кастов нет, иммено благодаря generic method
        Dao dao = findBean(applicationContext, Dao.class); 
        Service serviec = findBean(applicationContext, Dao.class);
    }
    
}

на самом деле applicationContext.getBean уже использует generic methods, так что тут конечно пример притянут за уши.
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840709
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0пример притянут за уши.да притянут. Давай другой.
Приведение типов есть.
Вот тут не будет:
var obj = findBean(...
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840711
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Я там наделал кучу ошибок, но в целом идея то должна быть понятна.
Код: 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.
public class Utils {
    
    public static Object findBean(ApplicationContext applicationContext, Class requiredClass) {
        return applicationContext.getBean(requiredClass);
    }

    public static <T> T findBeanEx(ApplicationContext applicationContext, Class<T> requiredClass) {
        return applicationContext.getBean(requiredClass);
    }

    public static void main(String[] args) {
        ApplicationContext applicationContext = ...;

        // тут нужны касты и можешь получить ошибки в runtime
        Dao dao = (Dao) getBean(applicationContext, Dao.class);
        Service service = (Service) getBean(applicationContext, Service.class);


        // тут приведение типов не нужно и еще получаешь проверку во время компиляции
        Dao dao = getBeanEx(applicationContext, Dao.class);
        Service service = getBeanEx(applicationContext, Service.class);
    }
    
}
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840713
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0,
Да. Теперь лучше))
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840781
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если во 2-м классе оставляем только один <T>
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MyClass2<T> implements MyInterface {
    
    private List<T> objectList;

    @Override
    public <T> void metodA(List<T> objectList) {
        this.objectList = objectList;
    }

}

, то получим ошибку:
Код: plaintext
1.
2.
3.
4.
incompatible types: List<T#1> cannot be converted to List<T#2>
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>metodA(List<T#1>)
    T#2 extends Object declared in class MyClass
----

Leonid KudryavtsevMolasarВедь необходимо указать использование дженерика.

Зачем?

Странно, что он на второй класс не ругается, т.к. что может означать конструкция " <V> void" я вообще не представляю.
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840793
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarЕсли во 2-м классе оставляем только один <T>
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MyClass2<T> implements MyInterface {
    
    private List<T> objectList;

    @Override
    public <T> void metodA(List<T> objectList) {
        this.objectList = objectList;
    }

}


здесь параметризованый тип <T> у метода "затеняет" параметризованый тип <T> твоего класса.
Код: java
1.
<T> void metodA(List<T> objectList)


здесь лучше написать
Код: java
1.
<U> void metodA(List<U> objectList)


а так как List<T> и List<U> разные типы, то компилятор потребует приведения типов
Код: java
1.
2.
3.
    public <U> void metodA(List<U> objectList) {
        this.objectList = (List<T>) objectList;
    }


либо можно изменить сигнатуру метода (думаю компилятор это должно "успокоить")
Код: java
1.
    public <U extends T> void metodA(List<U> objectList)
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840802
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как тогда объявлять в интерфейсе такой метод?
Код: java
1.
public <U extends T> void metodA(List<U> objectList)



vas0MolasarЕсли во 2-м классе оставляем только один <T>
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MyClass2<T> implements MyInterface {
    
    private List<T> objectList;

    @Override
    public <T> void metodA(List<T> objectList) {
        this.objectList = objectList;
    }

}


здесь параметризованый тип <T> у метода "затеняет" параметризованый тип <T> твоего класса.
Код: java
1.
<T> void metodA(List<T> objectList)


здесь лучше написать
Код: java
1.
<U> void metodA(List<U> objectList)


а так как List<T> и List<U> разные типы, то компилятор потребует приведения типов
Код: java
1.
2.
3.
    public <U> void metodA(List<U> objectList) {
        this.objectList = (List<T>) objectList;
    }


либо можно изменить сигнатуру метода (думаю компилятор это должно "успокоить")
Код: java
1.
    public <U extends T> void metodA(List<U> objectList)
...
Рейтинг: 0 / 0
Снова про дженерики
    #39840814
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

В интерфейсе это будет просто генерик метод
Код: java
1.
<Z> void metodA(List<Z> objectList);


А уже конкретные реализации могут добавлять деталей
Код: java
1.
<Z extends Number> void metodA(List<Z> objectList);


При этом типы лучше не затенять (чтобы не терять понимание). У меня ни разу не было случая чтобы я переопределял generic методы в наследниках, так как они уже и так сами по себе очень "параметризуемые и гибкие".
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Снова про дженерики
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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