Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Нетривиальное использование Generics


Автор: Royan 19.3.2008, 13:24
Вот мой случай
Код

class Feature {
    public Feature clone() {
        return new Feature();
    }
}

public class Test<T extends Feature> {
    Set<T> cuteSet;
    
    public synchronized List<T> getStuffByName(String name) {
        List<T> someList = new LinkedList<T>();
        
        if (cuteSet != null) {
            for (T item : cuteSet) {
                someList.add(item.clone());
            }
        }
        return someList;
    }
}


Объясните, пожалуйста, почему в строке 15 возникает ошибка? Ведь тип T уже ясно определен как подтип класса Feature, откуда ругань?

Автор: v2v 19.3.2008, 13:38
clone() возвращает экземпляр класса Feature, а тебе надо Т : сделай приведение типов.
Код

someList.add((Т)item.clone());

Автор: Shaggie 19.3.2008, 14:06
Цитата(v2v @  19.3.2008,  13:38 Найти цитируемый пост)
сделай приведение типов.

И компилятор ругаентся на unchecked cast. Странно, что конструкция <T extends Feature> никак не влияет на принимаемые им решения.

Автор: v2v 19.3.2008, 14:34
Цитата(Shaggie @  19.3.2008,  14:06 Найти цитируемый пост)
И компилятор ругаентся на unchecked cast.

не ругнётся, а просто предупредит.
ситуация ведь тривиальная ;)

Код

class A1{}
class A2 extends A1{}

//
A1 a1 = new A1();
A2 a2 = a1; // <- error here


Автор: Royan 19.3.2008, 14:47
v2v, Прав, спасибо!

Автор: w1nd 20.3.2008, 02:43
Цитата(Shaggie @  19.3.2008,  14:06 Найти цитируемый пост)
Странно, что конструкция <T extends Feature> никак не влияет на принимаемые им решения.

В принципе, ничего странного. <T extends Feature> - это не обязательно Feature. Если вместо T подставить наследника Feature, нехорошо получится. Зато вот так всё будет компилироваться без ошибок и предупреждений:

Код
interface CloneableFeature<T extends CloneableFeature<T>> {
    T clone();
}

class Feature implements CloneableFeature<Feature> {
    public Feature clone() {
        return new Feature();
    }
}

class Test<T extends CloneableFeature<T>> {
    Set<T> cuteSet;
    
    public synchronized List<T> getStuffByName(String name) {
        List<T> someList = new LinkedList<T>();
        
        if (cuteSet != null) {
            for (T item : cuteSet) {
                someList.add(item.clone());
            }
        }
        return someList;
    }

}



Автор: Shaggie 20.3.2008, 06:51
v2v, w1nd, спасибо!  smile 

Автор: Platon 20.3.2008, 09:58
Цитата(w1nd @  20.3.2008,  03:43 Найти цитируемый пост)
interface CloneableFeature<T extends CloneableFeature<T>>

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)