【问题标题】:Implementing an abstract generic method实现一个抽象的泛型方法
【发布时间】:2015-03-08 16:14:59
【问题描述】:

我在抽象类中有一个抽象泛型方法:

/**
 * @param <Value>
 */
public abstract class TestAbstract<Value> {

    public abstract <Value> void test(Value value);

}    

现在我从这个类扩展并实现抽象的泛型方法 - 这是我的尝试,但这显然是错误的。

public class Impl extends TestAbstract<Integer> {

    @Override
    public <Integer> void test(Integer value) {

        // value is instanceOf as java.lang.Object and not java.lang.Integer !

    }

}

test()value 被视为Object 而不是Integer...

我怎样才能覆盖这个方法,让我不得不使用'integer'-Class?

谢谢!

【问题讨论】:

  • Value 是您项目中的实际类吗?
  • 没有。我希望 value 成为这个抽象类的参数...
  • @peddn:有点不清楚你所说的“被视为Object”是什么意思,你能更具体一点吗?
  • value 是“Object”的实例,而不是“Integer”的实例。
  • 如果你的意思是int,那对于泛型是不可能的。

标签: java generics inheritance abstract


【解决方案1】:

您正在用具体类型替换类型参数。你可能打算这样做:

public abstract class TestAbstract<V> {
    public abstract void test(V value);
}    

(注意,按照惯例,类型参数应该是单个大写字母,如果可能的话)

现在,当您创建此类的具体实现时,您可以用具体类型替换此类型参数:

public class Impl extends TestAbstract<Integer> {

    @Override
    public void test(Integer value) {
        // Here, "value" is an Integer
    }
}

在这种情况下,方法本身不需要类型参数,因为它是在周围的上下文中定义的(即在类中)。

【讨论】:

  • 谢谢!这正是问题所在!
  • @Marco13 - 您写道“您不需要方法本身的类型参数。” 可以您在方法级别而不是在类级别执行此操作,还是必须在类级别执行此操作?
  • @risingTide 在方法级别是可能的,见docs.oracle.com/javase/tutorial/java/generics/methods.html
  • @Marco13 抱歉,我不清楚。我知道总体上是可能的,但我想知道在上面的具体示例中方法级别的实现会是什么样子。我看到您的回复已将其提升到班级级别的实施;是否有针对此特定问题的方法级实现?
  • @risingTide 至少,在这种情况下,您无法修复子类中的类型。有关详细信息,请考虑在单独的问题中询问您的特定用例(如果之前没有问过类似的问题)
【解决方案2】:

Impl 中的test 不是通用方法。它应该只适用于Integer 类。因此你只需要改变

public <Integer> void test(Integer value)

public void test(Integer value)

【讨论】:

  • 确实,这里它被视为一个泛型方法,很好看!也许您应该提供通用方法的链接以使其更清晰...
【解决方案3】:

把摘要改成这样:

public abstract class SuperClass<T> {
    public abstract void test(T value);
}

以及子类:

public class SubClass extends SuperClass<Integer> {
    public void test(Integer value) {
    }
}

它现在可以工作了,因为不再存在参数隐藏问题。

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2018-07-05
    • 2019-10-10
    相关资源
    最近更新 更多