Comments 16
public class SV : S, V
{
string S.m(int i)
{
System.Console.WriteLine("string");
return null;
}
void V.m(int i)
{
System.Console.WriteLine("void");
}
}
Так я не понял, о первоначальный вопрос про интерфейсы 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…
И никакой магии… от слова вообще.
Перегрузка, которая запрещена, или bridge-методы в Java