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()