6

For example we have some 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;
    }
}

And some child:

package inherit;

/**
 * TODO: Add comment
 *
 * @author Ruslan Ibragimov
 */
public class InheritClass extends AbstractClass<Integer> {


}

Lets do simple test

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()) {

Why this happens?

Ruslan
  • 14,229
  • 8
  • 49
  • 67

1 Answers1

0

Instead:

private AbstractClass test(AbstractClass aClass) {

use

private AbstractClass test(AbstractClass<? extends Integer> aClass) {

which will fix compiler and if you check return value of getStrings() in code assist, you will see Set intend of Set. Could be handy also read link provided by Radiodef in comments.

Lukino
  • 1,407
  • 13
  • 14