实现抽象泛型方法
Implementing an abstract generic method
我在抽象中有一个抽象泛型方法class:
/**
* @param <Value>
*/
public abstract class TestAbstract<Value> {
public abstract <Value> void test(Value value);
}
现在我从这个 class 扩展并实现抽象泛型方法 - 这是我的尝试,但这显然是错误的。
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?
谢谢!
test
in Impl
不是通用方法。它应该只适用于 class Integer
。因此你只需要改变
public <Integer> void test(Integer value)
到
public void test(Integer value)
将摘要改为:
public abstract class SuperClass<T> {
public abstract void test(T value);
}
子类为:
public class SubClass extends SuperClass<Integer> {
public void test(Integer value) {
}
}
现在可以使用了,因为不再有参数隐藏问题。
您正在用具体类型替换类型参数。您可能打算做这样的事情:
public abstract class TestAbstract<V> {
public abstract void test(V value);
}
(请注意,按照惯例,类型参数应尽可能为单个大写字母)
现在,当您创建此 class 的具体实现时,您可以用具体类型替换此类型参数:
public class Impl extends TestAbstract<Integer> {
@Override
public void test(Integer value) {
// Here, "value" is an Integer
}
}
在这种情况下,您不需要方法本身的类型参数,因为它是在周围上下文中定义的(即在 class 中)。
我在抽象中有一个抽象泛型方法class:
/**
* @param <Value>
*/
public abstract class TestAbstract<Value> {
public abstract <Value> void test(Value value);
}
现在我从这个 class 扩展并实现抽象泛型方法 - 这是我的尝试,但这显然是错误的。
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?
谢谢!
test
in Impl
不是通用方法。它应该只适用于 class Integer
。因此你只需要改变
public <Integer> void test(Integer value)
到
public void test(Integer value)
将摘要改为:
public abstract class SuperClass<T> {
public abstract void test(T value);
}
子类为:
public class SubClass extends SuperClass<Integer> {
public void test(Integer value) {
}
}
现在可以使用了,因为不再有参数隐藏问题。
您正在用具体类型替换类型参数。您可能打算做这样的事情:
public abstract class TestAbstract<V> {
public abstract void test(V value);
}
(请注意,按照惯例,类型参数应尽可能为单个大写字母)
现在,当您创建此 class 的具体实现时,您可以用具体类型替换此类型参数:
public class Impl extends TestAbstract<Integer> {
@Override
public void test(Integer value) {
// Here, "value" is an Integer
}
}
在这种情况下,您不需要方法本身的类型参数,因为它是在周围上下文中定义的(即在 class 中)。