java – 为什么要编译?代码似乎打破了类型参数的约束
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么要编译?代码似乎打破了类型参数的约束,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1880字,纯文字阅读大概需要3分钟。
内容图文
在下面的测试中,TesterClass对其两个类型参数之间的关系设置了约束.方法func2()似乎打破了这个约束,我希望它会在某处导致类型编译错误(在func2的定义中,或者每当类与String之外的任何第二个参数一起使用时),但它不会!
此外,如果我调用func2并将结果保存在适当类型的变量中,则编译失败(在该变量的类型上).但是做同样的事情并保存在更通用的类型(例如Object)中会成功,尽管事实上函数的返回类型在两种情况下都应该具有相同的类型(在向上转换之前).
这里发生了什么?
谢谢!
public class TestGenerics {
public static class ParamedType<T> {}
public class TesterClass<A extends ParamedType<B>, B> {
public TesterClass<A, B> func() {
return new TesterClass<A, B>();
}
public TesterClass<A, String> func2() {
return new TesterClass<A, String>();
}
}
public Object test() {
// How can I use these type parameters? Doesn't .func2 now have an invalid return type?
TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();
//TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
Object res = testClass.func2(); // Compiles
return res;
}
}
编辑:这不能在javac中编译(下面报告的版本).我正在使用Eclipse,并试图找出实际运行的编译器是什么.会更新.可能是JDT(Eclipse编译器)错误.
我已经为eclipse的jdt打开了一个错误报告:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503
解决方法:
简单回答:它不能编译,至少在javac 1.7下:
Test.java:10: type parameter A is not within its bound
public TesterClass<A, String> func2() {
^
where A,B are type-variables:
A extends ParamedType<B> declared in class Test.TesterClass
B extends Object declared in class Test.TesterClass
Test.java:11: type parameter A is not within its bound
return new TesterClass<A, String>();
^
where A,B are type-variables:
A extends ParamedType<B> declared in class Test.TesterClass
B extends Object declared in class Test.TesterClass
2 errors
你没有说你在编译它是什么 – 我的猜测是你的Java编译器有一个错误.
内容总结
以上是互联网集市为您收集整理的java – 为什么要编译?代码似乎打破了类型参数的约束全部内容,希望文章能够帮你解决java – 为什么要编译?代码似乎打破了类型参数的约束所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。