Rus*_*lan 6 java generics inheritance
例如,我们有一些AbsractClass
package inherit;
import java.util.HashSet;
import java.util.Set;
/**
* TODO: Add comment
*
* @author Ruslan Ibragimov
*/
public abstract class AbstractClass<T extends Integer> {
private Set<String> strings = new HashSet<>();
private T value;
public Set<String> getStrings() {
return strings;
}
public void setStrings(Set<String> strings) {
this.strings = strings;
}
public void addString(String string) {
strings.add(string);
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一些孩子:
package inherit;
/**
* TODO: Add comment
*
* @author Ruslan Ibragimov
*/
public class InheritClass extends AbstractClass<Integer> {
}
Run Code Online (Sandbox Code Playgroud)
让我们做简单的测试
package inherit;
/**
* TODO: Add comment
*
* @author Ruslan Ibragimov
*/
public class TestClass {
public static void main(String[] args) {
TestClass testClass = new TestClass();
testClass.test(new InheritClass());
}
private AbstractClass test(AbstractClass aClass) {
for (String string : aClass.getStrings()) {
System.out.println(string);
}
return aClass;
}
}
Make output:
Error:(16, 51) java: incompatible types
required: java.lang.String
found: java.lang.Object
for (String string : aClass.getStrings()) {
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
反而:
private AbstractClass test(AbstractClass aClass) {
Run Code Online (Sandbox Code Playgroud)
使用
private AbstractClass test(AbstractClass<? extends Integer> aClass) {
Run Code Online (Sandbox Code Playgroud)
这将修复编译器,如果您在代码辅助中检查 getStrings() 的返回值,您将看到 Set 的 Set 意图。也可以方便地阅读评论中 Radiodef 提供的链接。