Mỗi this answer và this answer, các phương pháp tĩnh Java không phải là ảo và không thể bị ghi đè. Bằng trực giác, do đó, điều này sẽ làm việc (thậm chí nếu trong 99% các trường hợp đó là chương trình nguy hiểm):Tại sao Java thực thi khả năng tương thích kiểu trả về cho các phương thức tĩnh bị ghi đè?
class Foo
{
public static String frob() {
return "Foo";
}
}
class Bar extends Foo
{
public static Number frob() {
return 123;
}
}
Tuy nhiên, trong thực tế điều này giúp bạn:
Foo.java:10: frob() in Bar cannot override frob() in Foo; attempting to use incompatible return type
found : java.lang.Number
required: java.lang.String
public static Number frob() {
^
ngây thơ, nó có vẻ như Foo.frob()
và Bar.frob()
không nên làm gì với nhau; nhưng Java khẳng định rằng họ làm. Tại sao?
(Nb: Tôi không muốn nghe lý do tại sao nên viết mã theo cách này, tôi muốn nghe những gì trong Java và/hoặc thiết kế JVM làm cho hạn chế này cần thiết.)
Đã cập nhật để thêm: Đối với những người nghĩ rằng trình biên dịch sẽ bị nhầm lẫn bằng cách gọi phương thức tĩnh trên các trường hợp, nếu bạn cho phép điều này: nó sẽ không. Nó đã có con số này ra trong trường hợp các phương pháp chữ ký là tương thích:
class Foo
{
static String frob() {
return "Foo";
}
}
class Bar extends Foo
{
static String frob() {
return "Bar";
}
}
class Qux {
public static void main(String[] args) {
Foo f = new Foo();
Foo b = new Bar();
Bar b2 = new Bar();
System.out.println(f.frob());
System.out.println(b.frob());
System.out.println(b2.frob());
}
}
giúp bạn:
Foo
Foo
Bar
Câu hỏi đặt ra là, lý do cụ thể là những gì lý do tại sao nó không thể như một cách dễ dàng (trong trường hợp không tương thích chữ ký) giúp bạn có được:
Foo
Foo
123
Woah, dude, man. – Tom
Tôi không tích cực điều này nhất thiết phải là quyết định tốt nhất có thể - nó đã dẫn đến những vụng về như [mã này trong tiếng ổi] (http://code.google.com/p/guava-libraries/source/browse/guava/ src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java) - nhưng nó không phải là một quyết định không hợp lý, và tôi cho rằng họ có lý do cho cuộc gọi phán xét này mà tôi chưa từng nghĩ đến. –
'myB' sẽ gọi' doThing() 'tắt của kiểu' myB'. –