Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以使用签名列表实现方法<;类别<;?扩展注释>&燃气轮机;在爪哇?_Java_Generics_Wildcard - Fatal编程技术网

Java 是否可以使用签名列表实现方法<;类别<;?扩展注释>&燃气轮机;在爪哇?

Java 是否可以使用签名列表实现方法<;类别<;?扩展注释>&燃气轮机;在爪哇?,java,generics,wildcard,Java,Generics,Wildcard,问题在于一般限制: public List<Class<? extends Annotation>> getAnnotations() { return new ArrayList<>(Arrays.asList(Override.class)); } 甚至有可能是由于JDK1.7类型推断的性质,还是通配符被破坏了 您可能已经知道,Arrays.asList(T…elems)方法是泛型的,但是我们很少明确指定希望该方法使用的类型参数,因此我们依赖于编

问题在于一般限制:

public List<Class<? extends Annotation>> getAnnotations() {
    return new ArrayList<>(Arrays.asList(Override.class));
}

甚至有可能是由于JDK1.7类型推断的性质,还是通配符被破坏了

您可能已经知道,
Arrays.asList(T…elems)
方法是泛型的,但是我们很少明确指定希望该方法使用的类型参数,因此我们依赖于编译器的类型推断功能

因此,当编译器看到一个
Arrays.asList(Override.class)
语句时,它将推断出该方法的类型参数应替换为
class
,也就是说,该方法的版本如下所示:

public List<Class<Override>> asList(Class<Override> ... elems)
现在可以很好地编译了,因为
类
若元素类型匹配,则ArrayList是列表的子类型:

List<? extends Number> l = new ArrayList<Integer>(); // allowed
没有意识到return语句只能使用更灵活的类型进行编译(顺便说一句,Java8类型推理更智能)。一种解决方法是明确指定类型参数:

Arrays.<Class<? extends Annotation>(Override.class);

数组。@kocko你用的是什么java?我有jdk1.7_079,这是我用它玩过的一个屏幕截图,我想我找到了原因。过一会儿我会写一个答案。从测试来看,在Java 7中,您需要参数化静态调用
数组。确切地说,我在答案中提到了这一点。这应该在Java 7-
列表中起作用谢谢您花费的时间。第一部分告诉我们,我们刚刚被类型检测欺骗了。据我所知,Java8中有一个变化,它分析assign语句的左边部分,所以它解决了这个问题。第二部分涉及集合中的一个经典子类型问题,我对此很熟悉。让我们等几天,看看我们是否错过了什么,如果一切顺利,我会接受的。再次感谢:)
public List<? extends Annotation> asList(Class<? extends Annotation> ... elems)
List<Class<Override>> overrides = Arrays.asList(Override.class);
List<Class<? extends Annotation>> annotations = new ArrayList<>();
annotations = overrides;
annotations.add(SuppressWarnings.class); //HUGE PROBLEM
annotations.add(Documented.class); //ANOTHER HUGE PROBLEM
List<? extends Number> l = new ArrayList<Integer>(); // allowed
List<Class<? extends Annotation>> l = new ArrayList<Class<Override>>();
Arrays.asList(Override.class)
Arrays.<Class<? extends Annotation>(Override.class);
List<Class<? extends Annotation>> list = Arrays.asList(Override.class);
return list;
List<? extends Class<? extends Annotation>> getAnnotations()