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


Автор: sergejzr 16.6.2008, 17:41
Код

public class TestClass {
    
public void test(List<String> a){}
public void test(List<Object>b){}
}


Зато ведь можно так:
Код

public class TestClass {
    
public void test(Vector<String> a){}
public void test(List<String>b){}
}

В принципе сигнатуры в первом случае можно ведь различить точно также, как и во втором.

Автор: v2v 16.6.2008, 18:06
во втором случае в параметрах используются два разных типа import java.util.List и import java.util.Vector. 

Автор: Дрон 16.6.2008, 18:13
Цитата(sergejzr @  16.6.2008,  17:41 Найти цитируемый пост)
В принципе сигнатуры в первом случае можно ведь различить точно также, как и во втором.

Сам уже сталкивался с этим. 
Как я понимаю, первый пример не работает из-за того, что на уровне байт-кода нет никаких шаблонов, а есть только метод public void test(java.util.List)

Автор: sergejzr 16.6.2008, 18:23
Цитата(v2v @  16.6.2008,  17:06 Найти цитируемый пост)
во втором случае в параметрах используются два разных типа import java.util.List и import java.util.Vector. 

Vector - производнoe от List.

Цитата(Дрон @  16.6.2008,  17:13 Найти цитируемый пост)
Как я понимаю, первый пример не работает из-за того, что на уровне байт-кода нет никаких шаблонов, а есть только метод public void test(java.util.List).

Ответ принимается. То есть из-за несовместимости на уровне байт кода.


Автор: Дрон 16.6.2008, 18:28
Цитата(sergejzr @  16.6.2008,  18:23 Найти цитируемый пост)
Ответ принимается. То есть из-за несовместимости на уровне байт кода.

Ну как-то так. То есть непосредственно во время компиляции твоего класса ещё можно было бы их различить, но вот когда класс уже собран, то все различия стираются.

Я не знаю зачем так сделано, можно было бы предположить, что для совместимости с предыдущими версиями Java, но вроде как классы, скомпилированные для Java 5, всё равно не будут работать с предыдущими JRE. А больше никаких предположений у меня нет.

Автор: serger 17.6.2008, 05:31
Цитата(Дрон @ 16.6.2008,  18:28)
Я не знаю зачем так сделано, можно было бы предположить, что для совместимости с предыдущими версиями Java, но вроде как классы, скомпилированные для Java 5, всё равно не будут работать с предыдущими JRE. А больше никаких предположений у меня нет.

Это потомучто javac компилятор, а java интерпретатор.. ;)  smile 

Интерпретатор байткода никак не связан с компилятором в байткод.

Автор: LSD 17.6.2008, 15:37
Цитата(Дрон @  16.6.2008,  19:28 Найти цитируемый пост)
Я не знаю зачем так сделано, можно было бы предположить, что для совместимости с предыдущими версиями Java, но вроде как классы, скомпилированные для Java 5, всё равно не будут работать с предыдущими JRE. А больше никаких предположений у меня нет.

На самом деле использовать генерики для JDK 1.4 можно.

А вот почему решили не делать поддержку генериков на уровне байткода, это действительно вопрос.

Автор: serger 17.6.2008, 16:08
Это более фундаментальная вещь - м/б уже делают...
Платформ много.

Автор: LSD 17.6.2008, 16:11
Цитата(serger @  17.6.2008,  17:08 Найти цитируемый пост)
Это более фундаментальная вещь - м/б уже делают...
Платформ много. 

Локомотив развития Java - Sun, если они этого не сделают, то этого и не будет. И у них ключевых платформы всего 3 - Windows, Linux, Solaris. Пока ни в одном roadmap-е я не видел упоминания о поддержке генериков на уровне байткода.

Автор: w1nd 17.6.2008, 16:58
К прозвучавшему ответу на вопрос топикстартера хочется добавить одно НО:

Код
class A {

    public abstract void method(Collection collection);

}

class B extends A {

    @Override public void method(Collection<?> collection) { // Это не компилируется
    }

}


В общем, отовсюду веет большой продуманностью ;)

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