Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Generics - как избавиться от Cast, Generics - как избавиться от Cast 
V
    Опции темы
Kizja
Дата 25.4.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Привет, не могу избавится от явного приведения типа в следующем примере, хотя думаю, что в данном случае это возможно:

Код

public class GerericTest {
    
    public static void main(String[] args) throws Exception {
        new GerericTest().test();
    }
    
    public void test() throws Exception {
        ClassInterfaceA genericA = (ClassInterfaceA) init(EnumA.TEST); // TODO: remove cast
        ClassInterfaceB genericB = (ClassInterfaceB) init(EnumB.TEST); // TODO: remove cast
        
        genericA.sayHelloA();
        genericB.sayHelloB();
    }
    
    private <T extends EnumInterface<? extends ClassInterface>> 
            ClassInterface init(T value) throws Exception {
        return value.getClassInterface().newInstance();
    }
}


Код

public interface ClassInterface {

}


Код

public interface ClassInterfaceA extends ClassInterface {
    public void sayHelloA();
}


Код

public interface ClassInterfaceB extends ClassInterface {
    public void sayHelloB();
}


Код

public class ClassA implements ClassInterfaceA {
    @Override
    public void sayHelloA() {
        System.out.println("Hello: " + this.getClass().getName());
    }
}


Код

public class ClassB implements ClassInterfaceB {
    @Override
    public void sayHelloB() {
        System.out.println("Hello: " + this.getClass().getName());
    }
}


Код

public interface EnumInterface<T extends ClassInterface> {
    public Class<? extends ClassInterface> getClassInterface();
}


Код

public enum EnumA implements EnumInterface<ClassInterfaceA> {
    TEST(ClassA.class);
    
    private Class<? extends ClassInterfaceA> clazz;

    private EnumA(Class<? extends ClassInterfaceA> clazz) {
        this.clazz = clazz;
    }
    
    @Override
    public Class<? extends ClassInterfaceA> getClassInterface() {
        return clazz;
    }
}


Код

public enum EnumB implements EnumInterface<ClassInterfaceB> {
    TEST(ClassB.class);
    
    private Class<? extends ClassInterfaceB> clazz;
    
    private EnumB(Class<? extends ClassInterfaceB> clazz) {
        this.clazz = clazz;
    }

    @Override
    public Class<? extends ClassInterfaceB> getClassInterface() {
        return clazz;
    }
}


Поскольку EnumA и EnumB имеют поля с конкретными интерфейсами ClassInterfaceA и ClassInterfaceB, а не общий интерфейс ClassInterface, то думаю, что можно изменить данный пример так, чтобы он возвращал то, что надо без использования каста...

Кто знает как сделать ?
PM MAIL   Вверх
Joss
Дата 25.4.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.3.2006

Репутация: нет
Всего: 1



Навскидку:
Код

public class GerericTest {
    private <T,U extends EnumInterface<T extends ClassInterface>> T init(U value) throws Exception {
        return value.getClassInterface().newInstance();
    }
}


Компилятора нет под рукой и проверить не получилось. :(
PM MAIL   Вверх
Kizja
Дата 25.4.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Joss, Данный вариант, к сожалению, не подходит... может вооружившись компилятором что-нибудь могли бы ещё посоветовать ? smile
PM MAIL   Вверх
Kircul
Дата 26.4.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: 6
Всего: 7



Попробуй так 
Код

public interface EnumInterface<T extends ClassInterface> {
    public Class<? extends T> getClassInterface();
}

и 
Код

private <T extends ClassInterface> T init(EnumInterface<T> value) throws Exception {
        return value.getClassInterface().newInstance();
}

PM   Вверх
Kizja
Дата 26.4.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Kircul

Супер, с твоим вариантом всё работает как надо...

Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0768 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.