У нас есть иерархия классов, подобная этой:
public class TestDereference {
private static MainInterface mi = new MainInterfaceImpl();
public static void main(String[] args) {
System.out.println(mi.getSubInterface().getField());
}
}
interface MainInterface {
T getSubInterface();
}
interface SubInterface {
Field getField();
}
class Field {
@Override
public String toString() {
return "Hooray!";
}
}
class SubInterfaceImpl implements SubInterface {
Field f = new Field();
public Field getField() {
return f;
}
}
class MainInterfaceImpl implements MainInterface {
SubInterfaceImpl si = new SubInterfaceImpl();
public T getSubInterface() {
return (T) si;
}
}
На самом деле интерфейсы имеют более одной реализации, но проблема не в этом. Компиляция с помощью компилятора Eclipse или Java 1.6 отлично работает (как показано на ideone ). Но если я попытаюсь скомпилировать это с помощью Java 1.5 (что является одним из требований нашего проекта), выдает следующую ошибку:
TestDereference.java:12: test.SubInterface cannot be dereferenced
System.out.println(mi.getSubInterface().getField());
^
Также обратите внимание, что этого не происходит с JDK 1.6 с использованием -target 1.5
либо только с JDK 1.5
Единственные случаи возникновения этой ошибки, которые я нашел в Интернете, связаны с такими действиями:
double d = 2.0;
d.toString();
где очевидно, в чем проблема.
Но в моем случае это должно быть работают, поскольку ясно, что getSubInterface ()
возвращает реализующий класс SubInterface
, который определенно имеет метод getField ()
.
Так это ошибка компилятора? И какие у меня есть варианты, кроме выполнения mi.
каждый раз (что работает, но поскольку Eclipse не отмечает это как ошибку, большинство людей в команде забывают это делать, и большинство из них используют только JDK 1.6, поэтому они не замечают этого и при компиляции с использованием строки maven / cmd)?