这是由于Java中对类型安全的限制引起的。实际上,这个问题的问题就在于,我们使用了一种通配符类型,并且我们需要在它的实现上进行操作,但我们不能将其指定为特定的类型。
例如,假设我们有以下类和方法:
public class Myclass { public void doSomething() { // do something here } }
public class MyGenericClass
public void doSomethingWithMyObject() {
myObject.doSomething();
}
}
如果我们想使用通配符来表示MyGenericClass的类型参数,则可以用以下方式声明:
MyGenericClass extends Myclass> myGenericClass;
请注意,我们没有指定实现的Myclass的确切类型。这是我们使用通配符的原因。
现在我们来看看这个问题。问题在于,我们尝试将Myclass类型的对象分配给类型为CAP#1的变量。实际上,CAP#1是通配符类型的捕获。由于我们没有指定通配符类型的确切实现,Java无法确定我们是否可以将Myclass类型的对象分配给CAP#1变量。
要解决这个问题,我们只需将通配符类型替换为确切的类型。例如,我们可以这样写:
MyGenericClass
现在,我们将通配符类型替换为Myclass类型,问题得到了解决。