java_user
java_user

Reputation: 939

Confusion with generics, java

I have generic class :

public class Test<T> {

    private Test<? extends T> myInstance;

    public Test<? extends T> getInstance () {
      return myInstance;
    }

    public void setInstance (Test<? extends T> argType) {
        this.myInstance = argType;
    }

}

And I have two classes in my class hierarchy relations:

public abstract class Alphabet {
    //code here
}

and

public class A extends Alphabet{

   public A() {
       super();
       System.out.print("This is A call");
   }
}

Finally I have a class where I want to store make generic class Test with particular type and set new Instance of Object -> A through setInstance() method:

public static void main(String[] args) {
        List<Alphabet> list = new ArrayList<Alphabet>();

        Test<Alphabet> tAlphabet = new Test<Alphabet>();
        tAlphabet.setInstance(new A()); //Here is compilation ERROR
}

But I have got the compilation error in line tAlphabet.setInstance(new A());

What is the issue with my generic class?

Upvotes: 0

Views: 54

Answers (2)

Marko Topolnik
Marko Topolnik

Reputation: 200168

It seems you have made things more complicated than needed. You probably want this in your Test class instead of what you actually have:

private T myInstance;

public T getInstance () {
  return myInstance;
}

public void setInstance (T argType) {
  this.myInstance = argType;
}

With this arrangement you would be free to setInstance(new A()) on a Test<Alphabet> instance.

Upvotes: 1

DennisW
DennisW

Reputation: 1057

Your instance is a Test object as it's currently written, and you are supplying it with an Alphabet object instead. You probably want your instance to be of type Alphabet:

public class Test<T> {
    private T myInstance;

    public T getInstance() {
        return myInstance;
    }

    public void setInstance(T argType) {
        myInstance = argType;
    }
}

This way, your Test stores an Alphabet instead of another Test.

Upvotes: 1

Related Questions