Как стать автором
Обновить

Комментарии 16

Мне всегда такие перегрузки в C# ломали мозг, это тот ещё паззл для интервью.
а кульбиты с байткодом в яве не ломают?
Они обычно вылезают только при появлении проблем, компилятор их в основном скрывает.
Хм, а каким именно образом они ломают мозг? Вроде бы простейший синтаксис же…
public не лишний?
лишний) спасибо, поправил

Так я не понял, о первоначальный вопрос про интерфейсы WithPrimitiveInt и WithInteger зачем задавали, если на него так и не ответили… Хоть он и легонький, но все же.

Не могу не спросить: зачем нужна черная магия с созданием методов с одинаковой сигнатурой? Иногда мне кажется, что людям заняться нечем, кроме как показать «пацаны, смотрите, как я умею» или, цитирую «Сногсшибательно, правда?». Практической ценности такое знание не несет, скорее, оно из разряда эзотерических. Ну так к чему все это?
Такие методы используются компилятором, чтобы улучшить жизнь разработчикам. Иногда, эта магия ломается (например, при несовместимости версий библиотек), поэтому полезно о ней знать.

 Вы после того, как текст от переводчика получили, хотя бы вычитку делайте. Ещё лучше — подготовьте ему глоссарий. Это же форменная дичь, переводить «implemented interfaces» как «встроенные интерфейсы» вместо «реализованные».


 Как из фразы «For example, if we wanted to invoke a method String m(int i) directly on a class foo.Bar» при переводе можно было получить «Например, если мы хотим включить метод String m(int i) непосредственно в класс foo.Bar, необходим следующий байт-код» — вообще загадка. Речь в оригинале идёт о вызове метода, а не о включении его куда-либо.


 По теме: для экспериментов по созданию нестандартных class-файлов удобнее использовать asmtools. Как пример, исходник класса с реализацией интерфейсов из статьи становится намного читаемее:


package  edio/java/experiments;

public class SV
    implements S, V
    version 51:0
{

public Method "<init>":"()V"
    stack 1 locals 1
{
        aload_0;
        invokespecial   Method java/lang/Object."<init>":"()V";
        return;
}

public Method m:"(I)Ljava/lang/String;"
    stack 2 locals 2
{
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "String";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        aconst_null;
        areturn;
}

public Method m:"(I)V"
    stack 2 locals 2
{
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "void";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        return;
}

} // end Class SV

Декомпилировать *.class-файл в 2018 году можно просто открыв его в IntelliJ IDEA, старичок JAD не обязателен.

Спасибо, поправил

Я возможно чего-то не понимаю, но по моему в статье слишком много всего ненужного.


Проще про наследование нельзя было объяснить?


Файл jtest/WithPrimitiveInt.java


package jtest;

public interface WithPrimitiveInt {
   void m(int a);
}

Файл jtest/WithInteger.java


package jtest;

public interface WithInteger  extends WithPrimitiveInt {
  void m(Integer a);
}

Файл имплементации интерфейсов jtest/Mimpl.java


package jtest;

public class Mimpl implements WithPrimitiveInt, WithInteger {
  public void m(int a)
  {
    System.out.println("m(int a), with a="+new Integer(a).toString());
  }
  public void m(Integer a)
  {
    System.out.println("m(Integer a), with a="+a.toString());
  }
}

Тестируем (Test.java):


public class Test
{
  public static void main(String [] args)
  {
    jtest.WithPrimitiveInt a=new jtest.Mimpl();
    a.m(1);
    a.m(new Integer(2));
    jtest.WithInteger b=new jtest.Mimpl();
    b.m(3);
    b.m(new Integer(4));
  }
}

Результат:


m(int a), with a=1
m(int a), with a=2
m(int a), with a=3
m(Integer a), with a=4

Обратите внимание на перегрузку в кейсе 2…


И никакой магии… от слова вообще.

Тут был цикл статей, почему не стоит нанимать джуниоров, а это начался цикл статей, почему не стоит нанимать сеньоров? Они высосут проблему из пальца и решат ее очень сложно)))
Это к сеньорам отношения никакого не имеет. Задача джуновская на множественное наследование. Зачем все танцы с бубном вокруг тривиальной задачи, — непонятно. Я например вообще на ява лет 10 уже не пишу. Но это элементарные вещи (см. пост выше).
Я это и сказал. Задача простая, а вокруг у нее устроили сеньорские танцы с бубном.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий