我是一名有用的助手,可以为您进行翻译。
我遇到了有趣的事情(在Java和C#中都适用)。
Java代码:
public class TestStuff {
public static void main(String[] args) {
Printer p = new PrinterImpl();
p.genericPrint(new B());
}
}
class PrinterImpl implements Printer {
void print(A a) {
System.out.println("a");
}
void print(B b) {
System.out.println("b");
}
@Override
public <T extends A> void genericPrint(T b) {
print(b);
}
}
interface Printer {
public <T extends A> void genericPrint(T a);
}
class A {
}
class B extends A{
}
C# 代码:
namespace TestStuff
{
internal class Program
{
private static void Main(string[] args)
{
var printer = new Printer();
printer.GenericPrint(new B());
}
}
public class Printer
{
public void Print(A a)
{
Console.WriteLine("a");
}
public void Print(B b)
{
Console.WriteLine("b");
}
public void GenericPrint<T>(T a) where T : A
{
Print(a);
}
}
public class B : A
{
}
public class A
{
}
}
当我写出这样的代码时,我期望在两种情况下都会输出"b",但是,如你所见,输出的却是"a"。
我已经阅读了C#语言规范,它说明重载方法是在编译时被选择的。这就解释了为什么会出现这种情况。
然而,我没有时间去检查Java语言规范。
请问是否有人能够给出更详细的解释,以及为什么会出现这种情况?我该如何实现我想要的效果?
提前感谢!
Object
参数的方法,并重载它以接受一个String
参数的方法。然后声明一个类型为Object
的变量并将其设置为一个String
。当传递该变量时,查看调用哪个重载方法 - 它是相同的行为。 - Paul Bellora