Java泛型编译错误 – 类型中的方法方法(Class)不适用于参数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java泛型编译错误 – 类型中的方法方法(Class)不适用于参数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1861字,纯文字阅读大概需要3分钟。
内容图文
![Java泛型编译错误 – 类型中的方法方法(Class)不适用于参数](/upload/InfoBanner/zyjiaocheng/823/74a883e0d6d5471887e262855079ab08.jpg)
上周四有人在工作时向我展示了一个编译错误,我无法以干净的方式修复它,从那以后它一直困扰着我.
问题是泛型相关,我重新构建了生成编译错误的简化版本的代码.错误发生在下面显示的最后一行代码中.
我一直在寻找各种各样的互联网,但似乎找不到一个合适的解释为什么Java编译器不接受代码.我想如果它允许代码,那么可能会在Bar.operationOnBar()中创建一个类转换问题,但我不知道如何.
有人可以请教我为什么不编译?
public interface Interface {
}
public class Type implements Interface {
}
public class Bar<T> {
public Bar(Class<T> clazz) {
}
public void operationOnBar(Class<T> arg){
}
}
public class Foo {
public <T> Bar<T> bar(Class<T> clazz){
return new Bar<T>(clazz);
}
public static void main(String[] args) {
Class<? extends Interface> extendsInterfaceClazz = Type.class;
new Foo().bar(extendsInterfaceClazz).operationOnBar(Type.class);
}
}
在Foo.main()的第二行编译错误:
The method operationOnBar(Class<capture#1-of ? extends Interface>) in the type Bar<capture#1-of ? extends Interface> is not applicable for the arguments (Class<Type>)
顺便说一句.我通过向下转换Type.class来解决它,这样编译器就无法看到Class的泛型类型是“Type”而不是“?extends Interface”.
解决方法:
一点建议:当你不确定为什么编译器禁止某些与泛型相关的转换时,用List< T>替换有问题的泛型类.然后很容易找到打破类型安全的例子.
这种替换是正确的,因为目前Java没有提供一种方法来进行关于泛型类的可能行为的任何小修知识(即它缺乏在声明中指定泛型类的协方差和逆变的方法,如在C#4和Scala中) .因此,Class< T>和列表< T>对于编译器而言,它们的可能行为是等价的,并且编译器必须禁止可能导致List< T>的问题的转换.对于其他泛型类也是如此.
在你的情况下:
public class Bar<T> {
private List<T> l;
public Bar(List<T> l) {
this.l = l;
}
public void operationOnBar(List<T> arg) {
l.addAll(arg);
}
}
List<Type1> l1 = new ArrayList<Type1>();
List<? extends Interface> l2 = l1;
List<Type2> l3 = Arrays.asList(new Type2());
new Foo().bar(l2).operationOnBar(l3);
Type1 t = l1.get(0); // Oops!
内容总结
以上是互联网集市为您收集整理的Java泛型编译错误 – 类型中的方法方法(Class)不适用于参数全部内容,希望文章能够帮你解决Java泛型编译错误 – 类型中的方法方法(Class)不适用于参数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。