【发布时间】:2014-03-01 15:04:39
【问题描述】:
我最近刚刚开始在 Java 中使用泛型,并且遇到了一些奇怪的行为。这是简化版本,但我有一个基类,它由多个类扩展,这些类被传递到一个通用函数中。在这个函数内部,我调用了一个方法,该方法具有多个版本,这些版本采用不同的基类或派生类作为参数。
如果我有以下情况:
public class A{};
public class B extends A{};
public class C extends A{};
public class Runner
{
public static void Run( ClassA a ){Do Something};
public static void Run( ClassB b ){Do Something};
public static void Run( ClassC c ){Do Something};
}
void SomeRandomCall<B extends ClassA>( B b )
{
Runner.Run( b );
}
SomeRandomCall<ClassB>( new ClassB() );
我在调试中发现 Runner.Run 正在调用 Run( ClassA a ) 而不是 Run( ClassB b ) 函数。鉴于这两个函数,由于提供了特定于类型的函数,不应该调用Run( ClassB b ) 吗?
如果不是这种情况,我将如何拥有一个可以调用的通用函数能够调用具有采用基类和派生类的签名的函数?
【问题讨论】:
-
“泛型”?你的意思是“继承”对吧?
-
void SomeRandomCall<B extends ClassA>( B b )应该是什么?为什么<>(什么表示泛型)中的 B(我是一个类)? -
“公共类 B 扩展 A{};”中的“B”与“void SomeRandomCall(B b)”中的“B”完全无关。也可能是“void SomeRandomCall
( Z z )” -
实际上,“void SomeRandomCall( B b )”是一个无效的方法声明。我假设您的意思是“ void SomeRandomCall(B b)”(在返回类型之前,没有“Class”!)
-
你能用你用过的实际代码替换你的摘要伪代码吗?您发布的内容有几个语法错误,意图不明确。
标签: java generics inheritance polymorphism