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


Автор: gelo86 3.8.2010, 20:24
Просто для интереса. Если есть такой код:

Код

public class X {

    public <X> X(X x) {
        X s = null;
        s = x;
        System.out.println(s);
        X s2 = new X("inner");
        System.out.println(s2);
    }

    public static void main(String[] args) {
        System.out.println(new X(new String("as param")));
    }

}


Как переменную s2 обявить типом класса а не типа дхенерика ?

Автор: ki6opr 4.8.2010, 03:08
Цитата(gelo86 @ 3.8.2010,  20:24)
Просто для интереса. Если есть такой код:

Код

public class X {

    public <X> X(X x) {
        X s = null;
        s = x;
        System.out.println(s);
        X s2 = new X("inner");
        System.out.println(s2);
    }

    public static void main(String[] args) {
        System.out.println(new X(new String("as param")));
    }

}


Как переменную s2 обявить типом класса а не типа дхенерика ?

это даже не скомпилируется.
кстати в вашем случае в конструктор ожидается объект класса X, который невозможно создать так как у него нет ниодного другого конструктора smile

Автор: jk1 4.8.2010, 07:37
Цитата

Как переменную s2 обявить типом класса а не типа дхенерика ? 

Никак. Именуйте классы согласно JavaCodeConventions и таких проблем никогда не возникнет.
Такой вопрос, кстати, попадался на SCJP.

Автор: gelo86 4.8.2010, 09:44
Цитата(ki6opr @  4.8.2010,  03:08 Найти цитируемый пост)
кстати в вашем случае в конструктор ожидается объект класса X

Нет, параметар может быть любым, ето параметризированный тип (дхенерика). Если стереть переменную s2, все будет работать smile


Цитата(jk1 @  4.8.2010,  07:37 Найти цитируемый пост)
Такой вопрос, кстати, попадался на SCJP. 

Я сейчас и читаю книжку по SCJP. Там и нашол что такое может быть, но я пошел дальше с размышлениями.






Автор: oxigen 4.8.2010, 13:50
А если так?

Код

package test;

public class X {

    public <X> X(X x) {
        X s = null;
        s = x;
        System.out.println(s);
        test.X s2 = new test.X("inner");
        System.out.println(s2);
    }

    public static void main(String[] args) {
        System.out.println(new X(new String("as param")));
    }

}

Автор: ki6opr 5.8.2010, 03:35
Цитата(oxigen @ 4.8.2010,  13:50)
А если так?

Код

package test;

public class X {

    public <X> X(X x) {
        X s = null;
        s = x;
        System.out.println(s);
        test.X s2 = new test.X("inner");
        System.out.println(s2);
    }

    public static void main(String[] args) {
        System.out.println(new X(new String("as param")));
    }

}

а вот так у меня получилась рекусия и stack overflow, почему наверное всем понятно smile
но выходит что можно

Автор: jk1 5.8.2010, 07:40
Цитата

но выходит что можно

Для пакета по умолчанию (как в топике) не сработает, но идея понравилась, сам я проглядел этот вариант smile  

Автор: gelo86 5.8.2010, 09:43
Вот блин, я тоже както недодумался указать package smile

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