我在抽象类中有一个抽象的泛型方法:
/**
* @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?
谢谢!
答案 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) {
}
}
它现在有效,因为不再存在参数隐藏问题。