集合成为原始类型

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)

为什么会这样?

Luk*_*ino 0

反而:

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 提供的链接。