Sun JDK 1.5无法解除对泛型的错误

And*_*anu 6 java generics jdk1.5

我们有一个类似于这个的类层次结构:

public class TestDereference {
 private static MainInterface mi = new MainInterfaceImpl();

 public static void main(String[] args) {
  System.out.println(mi.getSubInterface().getField());
 }
}

interface MainInterface {
 <T extends SubInterface> 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 extends SubInterface> T getSubInterface() {
  return (T) si;
 }
}
Run Code Online (Sandbox Code Playgroud)

接口实际上有多个实现,但这不是问题.使用Eclipse编译器或Java 1.6编译它可以正常工作(如ideone所示).但是,如果我尝试使用Java 1.5(这是我们项目的要求之一)编译它,则会出现以下错误:

TestDereference.java:12: test.SubInterface cannot be dereferenced
                System.out.println(mi.getSubInterface().getField());
                                                     ^
Run Code Online (Sandbox Code Playgroud)

另请注意,JDK 1.6使用-target 1.5JDK 1.5 时也不会发生这种情况

我在网上发现此错误的唯一情况与执行以下操作有关:

double d = 2.0;
d.toString();
Run Code Online (Sandbox Code Playgroud)

显而易见的问题是什么.

但是我的情况它应该可以工作,因为很明显getSubInterface()返回一个SubInterface肯定有getField()方法的实现类.

这是编译器错误吗?除了mi.<SubInterface>getSubInterface()每次都做什么,我还有什么选择(哪个有效,但是由于Eclipse没有将此标记为错误,团队中的大多数人都忘了这样做,而且大多数人只使用JDK 1.6,所以他们没有注意到在使用maven/cmd行进行编译时)?

dac*_*cwe 1

检查错误:https://bugs.java.com/bugdatabase/view_bug? bug_id=5003431

选项一:

SubInterface si = mi.getSubInterface();
si.getField();
Run Code Online (Sandbox Code Playgroud)

选项二:

mi.<SubInterface>getSubInterface().getField()
Run Code Online (Sandbox Code Playgroud)