实现抽象泛型方法

时间:2015-01-10 11:44:24

标签: java generics inheritance abstract

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

/**
 * @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?

谢谢!

3 个答案:

答案 0 :(得分:5)

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

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
    }
}

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

答案 1 :(得分:1)

test中的

Impl并非旨在成为通用方法。它应该只适用于班级Integer。因此,您只需要更改

public <Integer> void test(Integer value)

public void test(Integer value)

答案 2 :(得分:1)

将摘要改为:

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

子类:

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

它现在有效,因为不再存在参数隐藏问题。