首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中使用递归泛型时不兼容的类型

在Java中使用递归泛型时不兼容的类型
EN

Stack Overflow用户
提问于 2018-08-16 04:54:54
回答 1查看 113关注 0票数 3

我已经编写了java code,其中我使用泛型的递归形式来实现使生成器模式可继承的干净方式。

这是可行的,但是我不理解从java编译器得到的一些警告和错误。

这是我不理解的部分的严格简化版本:

代码语言:javascript
复制
package nl.basjes.test;

public class Foo<X extends Foo<X>> {
  public X doSomething() {
    return this;
  }
}

对于"return this;“,我得到了错误

代码语言:javascript
复制
Incompatible Types
Required: X
Found   : nl.basjes.test.Foo <X>

现在'this‘总是Foo的子类(甚至是Foo本身),'X’被定义为X extends Foo<X>。据我所知,这些应该是“相同的”,但显然不是。

因此,在我的代码中,我向return语句添加了一个类型转换,如下所示:

代码语言:javascript
复制
package nl.basjes.test;

public class Foo<X extends Foo<X>> {
  public X doSomething() {
    return (X)this;
  }
}

这使得代码按照预期和预期进行编译和工作。

然而,由于与上面相同的原因,我仍然收到关于“未检查的强制转换”的警告(但现在它只是一个警告)。

代码语言:javascript
复制
$ 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>)和this (扩展Foo<X>)是兼容的?

在这一点上,我最好的猜测是,这与我还不理解的类型擦除的一部分有关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 05:39:57

当您考虑具体的类型参数时,就会更容易看到问题:

假设

代码语言:javascript
复制
Foo<Bar> barFoo = ...;

当您调用barFoo.doSomething()时,您希望获得一个Bar对象:

代码语言:javascript
复制
Bar bar = barFoo.doSomething()

但是,您的实际实现:

代码语言:javascript
复制
public X doSomething() {
  return this;
}

可以大致填充以下具体参数:

代码语言:javascript
复制
public Bar doSomething() {
  return this; //But "this" is a Foo<Bar>, not a Bar.
}

这里有一个不同的例子,让它变得更加明显:

代码语言:javascript
复制
class Bar extends Foo<Bar> {
}
class Baz extends Foo<Bar> { //note this is a Foo<Bar>
}

和:

代码语言:javascript
复制
Baz baz = new Baz();
Bar bar = baz.doSomething();

在上面的代码中,您期望baz.doSomething()返回一个Bar,但是doSomething()中的代码返回一个Baz,但是将它强制转换为Bar,这有一个类型安全问题(实际上,这些类型是不兼容的,但是只有在上一个示例中有不同的类时,您才会得到一个classes异常)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51866295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档