与泛型混淆,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())
。
我有通用的 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())
。