【问题标题】:Return subclass from generic abstract class java从通用抽象类 java 返回子类
【发布时间】:2014-06-08 17:02:53
【问题描述】:

所以,我有一个代表输入类型对象的抽象类 -

public abstract class Input<E>

我有两个扩展它的类,一个是 ButtonInput,另一个是 TextInput。两者都扩展输入,所以它并不重要。我将使用 TextInput 来解释。
这是 TextInput 类的定义:

public class TextInput extends Input<TextInput>

我想要做的是将 this 返回为 E(在这种情况下为 TextInput)-

public E setTextColor(Color color) {
        this.colorText = color;
        return (E)this;
    }

所以,如果我打电话给例如:

new TextInput().setColor(Color.black)

它应该返回 TextInput。它正在工作,但它显示以下警告 -

警告:[unchecked] 未经检查的演员表
返回 (E) 这个; 必需:E
找到:输入
其中 E 是类型变量:
E 扩展在 Input 类中声明的 Object

关于以下代码行 -

 return (E) this;

有人知道怎么解决吗?
谢谢

【问题讨论】:

  • 这个方法不需要&lt;E extends Input&gt;,E已经参数化了。
  • 还有,什么是ButtonInput?
  • @OliCharlesworth 我已经删除了你所说的内容,现在当我编译 lint 时会警告我未经检查的演员表。而 ButtonInput 只是另一个代表图形按钮的类
  • 但是 ButtonInput 不在您向我们展示的代码中。请构建一个完整的测试用例。
  • 你不应该返回 "Input" 而不是 "E" 吗?我建议您观看此视频:sites.google.com/site/io/effective-java-reloaded,此处演示:14b1424d-a-62cb3a1a-s-sites.googlegroups.com/site/io/…

标签: java generics


【解决方案1】:

这是我过去在抽象构建器模式中用来解决此类问题的一种模式。它依赖于一个抽象的me() 方法,该方法被重写以返回对具体对象的引用。

abstract class Foo<T> {
    protected abstract T me();

    public T baz() {
        return me();
    }
}

class Bar extends Foo<Bar> {
    protected Bar me() {
        return this;
    }
}

【讨论】:

  • 真聪明,我试试看
  • 解决了我的问题。这有点棘手,但工作得很好并删除了警告。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2016-09-21
  • 1970-01-01
相关资源
最近更新 更多