Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / 2 вопроса / 17 сообщений из 17, страница 1 из 1
25.10.2014, 22:59
    #38787383
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
Добрый день!
1. Как можно сделать:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Map<Class<?>, SomeWrapper<?>> mapper = new HashMap...

mapper.put(Dog.class, new SomeWrapper<Dog>);
mapper.put(Cat.class, new SomeWrapper<Cat>);

Чтобы:

mapper.get(Cat.class);

Возвращал тип SomeWrapper<Cat>?
Чтобы без Uncheked cast обойтись?



2.
Eclipse Luna.
Проект A ссылается на проект B который ссылается на проект C. Ссылается = имеет в build-path и в referenced projects галочкой отмечен. При изменении исходников в B, при экспорте A он перекомпилирует B и все нормально, но если изменить C, то после экспорта A там по прежнему "предыдущий С". Приходится каждый раз делать clean, что неудобно. Как разрулить?
...
Рейтинг: 0 / 0
27.10.2014, 09:32
    #38787852
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
no56892,

1. Сделать наследника у HashMap с переопределенным get.
...
Рейтинг: 0 / 0
27.10.2014, 09:51
    #38787866
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
no56892,

По первому вопросу, лучше завести свои generic методы. Потому что в ваш Map<Class<?>, SomeWrapper<?>> можно засунуть что угодно с точки зрения generic.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
<T> void map(Class<T> clazz, Wrapper<T> wrapper){
     map.put(class, wrapper);
}

<T> Wrapper<T> getWrapper(Class<T> clazz){
     //Здесь,  unchecked cast можно подавить, так как типы мы гарантируем методами.
     return map.get(clazz);
}
...
Рейтинг: 0 / 0
29.10.2014, 00:06
    #38790005
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
Спасибо.
А вот еще, почему так нельзя?
Код: java
1.
List<ArrayList<? extends ArrayList>> rr = new ArrayList<ArrayList<ArrayList>>();
...
Рейтинг: 0 / 0
29.10.2014, 10:17
    #38790298
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
Код: java
1.
2.
3.
4.
public class Dog extends Wrappable{
   @Override
   public DogWrapper getMyWrapper(){...}
}
...
Рейтинг: 0 / 0
29.10.2014, 10:50
    #38790348
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
mayton
Код: java
1.
2.
3.
4.
public class Dog extends Wrappable{
   @Override
   public DogWrapper getMyWrapper(){...}
}


Ну это ж если заранее известны все классы.
...
Рейтинг: 0 / 0
29.10.2014, 11:59
    #38790487
Santex78
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
no56892Спасибо.
А вот еще, почему так нельзя?
Код: java
1.
List<ArrayList<? extends ArrayList>> rr = new ArrayList<ArrayList<ArrayList>>();



Насколько я понял, когда вы пишете
Код: java
1.
 ArrayList<? extends ArrayList>  


вы расчитываете что Внешний ArrayList будет состоять из наследников ArrayList, то есть сам ArrayList подставлять нельзя. А вот
Код: java
1.
List<ArrayList<? extends ArrayList>> rr = new ArrayList<ArrayList<Vector>>();


должно проканать.
...
Рейтинг: 0 / 0
29.10.2014, 12:18
    #38790518
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
Santex78должно проканать.
Нет. Дело не в этом. Многие ошибочно полагают, что из того что
ArrayList<? extends ArrayList> rr = new ArrayList<ArrayList>(); является безопасным приведением, следует и то что
ArrayList<ArrayList<? extends ArrayList>> rr = new ArrayList<ArrayList<ArrayList>>();
является безопасным приведением тоже. А это не так.
...
Рейтинг: 0 / 0
29.10.2014, 12:37
    #38790553
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
BlazkowiczSantex78должно проканать.
Нет. Дело не в этом. Многие ошибочно полагают, что из того что
ArrayList<? extends ArrayList> rr = new ArrayList<ArrayList>(); является безопасным приведением, следует и то что
ArrayList<ArrayList<? extends ArrayList>> rr = new ArrayList<ArrayList<ArrayList>>();
является безопасным приведением тоже. А это не так.
А какой здесь возможен вариант "опасного использования" ?
...
Рейтинг: 0 / 0
29.10.2014, 12:45
    #38790562
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
Код: java
1.
2.
3.
ArrayList<ArrayList<ArrayList>> original = new ArrayList<ArrayList<ArrayList>>();
ArrayList<ArrayList<? extends ArrayList>> rr = new ArrayList<ArrayList<ArrayList>>();
rr.add(new ArrayList<ExtendedArrayList>());
...
Рейтинг: 0 / 0
29.10.2014, 12:46
    #38790564
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
Ой. То есть так:
Код: java
1.
2.
3.
4.
5.
ArrayList<ArrayList<ArrayList>> original = new ArrayList<ArrayList<ArrayList>>();
original.add(new ArrayList<ExtendedArrayList>()); //Нельзя

ArrayList<ArrayList<? extends ArrayList>> rr = original;
rr.add(new ArrayList<ExtendedArrayList>()); //Уже можно
...
Рейтинг: 0 / 0
29.10.2014, 12:51
    #38790573
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
no56892mayton
Код: java
1.
2.
3.
4.
public class Dog extends Wrappable{
   @Override
   public DogWrapper getMyWrapper(){...}
}


Ну это ж если заранее известны все классы.
Твой код - это черный ящик. На вход приходит один класс. На выходе - другой. Верно?
...
Рейтинг: 0 / 0
29.10.2014, 12:54
    #38790578
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
maytonno56892Ну это ж если заранее известны все классы.
Твой код - это черный ящик. На вход приходит один класс. На выходе - другой. Верно?
Твой вариант создаёт явную связь между классами Dog/DogWrapper. Количество таких явных связей усложняет будущий рефакторинг.
...
Рейтинг: 0 / 0
29.10.2014, 14:00
    #38790683
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
В задаче не были декларированы требования связности. Поэтому исхожу из простого
но рабочего решения. Немного подправил.

Код: java
1.
2.
3.
4.
public class Dog extends Wrappable{
   @Override
   public Class getMyWrapper(){...}
}
...
Рейтинг: 0 / 0
29.10.2014, 14:31
    #38790739
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
maytonВ задаче не были декларированы требования связности.
GRASP, как и другие best practices, вроде, не требуют декларации.
...
Рейтинг: 0 / 0
29.10.2014, 14:45
    #38790761
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
Эти споры мне почему-то напомнили SpringConfigurations. Есть просто разные
точки зрения на % хардкода и % конфигураций. Вобщем хочешь простоты - пиши
хардкод. Хочешь гибкости - выноси больше конфигураций. Но расплата
не заставит себя долго ждать. Где -то "выстрелит". Либо сложность. Либо
трудночитаемость. Либо еще что-то.

Всё что я здесь написал это моё чортово ИМХО и я могу завтра быть с ним
несогласен.
...
Рейтинг: 0 / 0
30.10.2014, 20:59
    #38792270
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 вопроса
BlazkowiczОй. То есть так:
Код: java
1.
2.
3.
4.
5.
ArrayList<ArrayList<ArrayList>> original = new ArrayList<ArrayList<ArrayList>>();
original.add(new ArrayList<ExtendedArrayList>()); //Нельзя

ArrayList<ArrayList<? extends ArrayList>> rr = original;
rr.add(new ArrayList<ExtendedArrayList>()); //Уже можно


Понял. А что послужило причиной, что к дженерикам не применяется иерархия типов?

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


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