Java 中的泛型类型化内部类
我学习和尝试Java泛型已经有一段时间了,但我遇到了一些我无法解释的事情。以以下代码为例:
public class Question {
public <T> Sub<T> getSub(Class<T> c) {
return new Sub<T>(c);
}
public class Sub<S> {
private Class<S> c;
public Sub(Class<S> c) {
this.c = c;
}
public void add(S s) {
}
}
}
和测试代码:
import generics.Question.Sub;
public class Answer {
public static void main(String [] args) {
Question q = new Question();
Sub<String> s = q.getSub(String.class);
s.add("");
}
}
当它运行时,它会给出一个非常神秘的错误消息:
C:\Answer.java:8: incompatible types
found : generics.Question.Sub<java.lang.String>
required: generics.Question.Sub<java.lang.String>
Sub<String> s = q.getSub(String.class);
1 error
现在,通过一些实验,我已经找到了如何防止编译器错误的方法。我可以使 Sub 类成为静态内部类,或者我需要将 Sub 类称为 Question.Sub<String>。我不能做的是解释为什么我需要这样做。
我已经阅读了一些关于泛型的Java文档,但没有一个涵盖这种特殊情况。
任何人都可以解释为什么代码在当前形式下是不兼容的类型?
-编辑-
仔细观察这一点,我可以看到我在 Netbeans 之外也得到了相同的行为。如果我的代码在以下结构中:
generics\
generics\Question.java
generics\Answer.java
当我一起编译文件时,我没有收到错误:
C:\>javac generics\Question.java generics\Answer.java
C:\>
但是,当我首先编译问题,然后编译答案时,我收到错误:
C:\>javac generics\Question.java
C:\>javac generics\Answer.java
generics\Answer.java:8: incompatible types
found : generics.Question.Sub<java.lang.String>
required: generics.Question.Sub<java.lang.String>
Sub<String> s = q.getSub(String.class);
^
1 error
我听说过一些关于类型擦除的事情。在这种情况下,情况是否如此?