Я столкнулся с интересной вещью (работает одинаково как на 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.
Может кто-нибудь дать более подробное объяснение того, что происходит и почему?И как мне достичь того, чего я хотел?
Заранее спасибо!