与泛型混淆,java

Confusion with generics, java

我有通用的 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;
    }

}

我的 class 层级关系中有两个 class:

public abstract class Alphabet {
    //code here
}

public class A extends Alphabet{

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

最后我有一个 class 我想在其中存储使用特定类型进行通用 class 测试并通过 setInstance() 方法设置对象的新实例 -> A:

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
}

但是我在tAlphabet.setInstance(new A());

行遇到了编译错误

我的通用 class 有什么问题?

您的实例是一个 Test 当前写入的对象,而您正在为其提供一个 Alphabet 对象。您可能希望实例的类型为 Alphabet:

public class Test<T> {
    private T myInstance;

    public T getInstance() {
        return myInstance;
    }

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

这样,您的 Test 会存储一个 Alphabet 而不是另一个 Test

看来你把事情弄得比需要的更复杂了。你可能想要在你的测试中使用这个 class 而不是你实际拥有的:

private T myInstance;

public T getInstance () {
  return myInstance;
}

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

通过这种安排,您可以在 Test<Alphabet> 个实例上自由 setInstance(new A())