java - 通配符捕获错误: why?

标签 java generics

我无法理解通配符捕获错误,或者找到了规避它的方法:

import java.util.List;


class A<B extends A.AA<? extends C>, C> {

  List<C> list;

  public void foo(B inner) {
    C c = get();
    inner.nop(c);
  }

  private C get() {
    return list.get(0);
  }

  static public class AA<D> {
    public void nop(D d) {
        System.out.println(d);
    }
  }
}

这是 javac 输出:

Wildcards.java:10: error: method nop in class AA<D> cannot be applied to given types;                
      inner.nop(c);                                                                                
          ^                                                                                       
required: CAP#1                                                                                    
found: C                                                                                           
reason: actual argument C cannot be converted to CAP#1 by method invocation conversion             
where C,D are type-variables:                                                                      
  C extends Object declared in class A                                                             
  D extends Object declared in class AA                                                            
where CAP#1 is a fresh type-variable:                                                              
  CAP#1 extends C from capture of ? extends C                                                      
1 error 

为什么我们不能将 C 的实例传递给 B.nop()?

最佳答案

假设您创建了一个 A 实例:

A<A.AA<String>,Object> a = new A<A.AA<String>,Object>();
A.AA<String> inner = new A.AA<String>();
a.foo(inner);

inner.nop() 应该期望一个 String,但您传递给它的是一个 Object

一个可能的解决方法是:

class A<B extends A.AA<C>, C>

关于java - 通配符捕获错误: why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28064817/

相关文章:

java - Selenium Marionette 驱动程序在第二次启动时出现 UnreachableBrowserException

java - 找出输入接口(interface)的实现类型

java - 用objective-c在java中模拟接口(interface)

java - Dagger 2 未经检查的警告

java - 继承了一些不好的 Java 泛型

java - 如何在ArrayList<中添加元素?通过方法扩展 SomeType>

java - OrientDB性能测试禁用缓存

java - 用于指定对泛型方法的方法引用的语法

Java - 泛型方法的数组参数的类型推断

c# - C# 中泛型的接口(interface)和继承