在Java中使用递归泛型时不兼容的类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中使用递归泛型时不兼容的类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1813字,纯文字阅读大概需要3分钟。
内容图文
![在Java中使用递归泛型时不兼容的类型](/upload/InfoBanner/zyjiaocheng/728/499c755805a74ee69ad3ef19f7927dd3.jpg)
我写过java code,其中我使用递归形式的泛型来实现一种使Builder模式可继承的简洁方法.
这有效,但我不明白我从java编译器得到的一些警告和错误.
这是我不理解的部分的严重简化版本:
package nl.basjes.test;
public class Foo<X extends Foo<X>> {
public X doSomething() {
return this;
}
}
对于“归还这个”;我收到了错误
Incompatible Types
Required: X
Found : nl.basjes.test.Foo <X>
现在’this’始终是Foo的子类(甚至是Foo本身),’X’被定义为X extends Foo< X>.
据我所知,这些应该是“相同的”,但显然它们不是.
所以在我的代码中我添加了一个强制转换为return语句,如下所示:
package nl.basjes.test;
public class Foo<X extends Foo<X>> {
public X doSomething() {
return (X)this;
}
}
这使代码编译和按预期和预期工作.
然而,由于与上述相同的原因,我仍然会收到关于“未经检查的演员表”的警告(但现在它只是一个警告).
$javac -Xlint:unchecked nl/basjes/test/Foo.java
nl/basjes/test/Foo.java:5: warning: [unchecked] unchecked cast
return (X)this;
^
required: X
found: Foo<X>
where X is a type-variable:
X extends Foo<X> declared in class Foo
1 warning
为什么Java没有看到X(扩展Foo< X>)和这个(扩展Foo< X>)兼容?
在这一点上,我最好的猜测是,这与我还不了解的类型擦除的一部分有关.
解决方法:
当您考虑具体类型参数时,更容易看到问题:
假设
Foo<Bar> barFoo = ...;
当你调用barFoo.doSomething()时,你希望得到一个Bar对象:
Bar bar = barFoo.doSomething()
但是,您的实际实施:
public X doSomething() {
return this;
}
可以大致填写以下具体参数:
public Bar doSomething() {
return this; //But "this" is a Foo<Bar>, not a Bar.
}
这是一个不同的例子,使其更加明显:
class Bar extends Foo<Bar> {
}
class Baz extends Foo<Bar> { //note this is a Foo<Bar>
}
和:
Baz baz = new Baz();
Bar bar = baz.doSomething();
在上面,你希望baz.doSomething()返回一个Bar,但是doSomething()中的代码返回一个Baz,但是将它转换为Bar,它有一个类型安全问题(实际上,这些类型是不兼容的,但是当你有不同的类时,你只得到一个classcastexception,如上例所示).
内容总结
以上是互联网集市为您收集整理的在Java中使用递归泛型时不兼容的类型全部内容,希望文章能够帮你解决在Java中使用递归泛型时不兼容的类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。