Đối với một giao diện chung:Ký tự đại diện kiểu Java của Java thực sự có ý nghĩa gì? Sự khác biệt thực sự giữa Foo và Foo <?> là gì?
public interface Foo<T> {
void f(T t);
}
Sự khác biệt giữa hai lĩnh vực:
public class Bar {
Foo foo1;
Foo<?> foo2;
}
Là foo2
là một loại generic và foo
thì không. Vì ?
là một ký tự đại diện (mà tôi nghĩ là bất kỳ loại nào) và mọi loại là một loại đối tượng, sau đó tôi đã mong đợi Foo<?>
và Foo<Object>
tương đương ngữ nghĩa và cú pháp.
Tuy nhiên, hãy kiểm tra như sau:
public class Puzzler {
void f() {
Integer i = null;
Foo<?> foo1 = null;
foo1.foo(i); // ERROR
Foo foo2 = null;
foo2.foo(i); // OKAY
Foo<Integer> foo3 = null;
foo3.foo(i); // OKAY
Foo<Object> foo4 = null;
foo4.foo(i); // OKAY
}
private interface Foo<T> {
void foo(T t);
}
}
Vì vậy Foo<?>
và Foo<Object>
là không cùng cú pháp.
Điều gì đang xảy ra ở đây? Tôi khá mắc kẹt khi cố hiểu điều này.
giả định đây là lỗi biên dịch? – paislee
@andrewcooke Mã đó sẽ hợp lệ; tuy nhiên, vì đối tượng sẽ được lưu trữ trong biến 'Foo >', nó sẽ không biết về tham số 'Chuỗi'. Do đó, nếu 'Foo' có bất kỳ phương thức nào lấy đối số của kiểu' T', thì giá trị được phép duy nhất sẽ là 'null' và nếu nó có bất kỳ phương thức nào trả về' T', thì nó được coi là 'Object'. – Taymon
xin lỗi, đã xóa nhận xét của tôi trước khi tôi thấy câu trả lời của bạn. bây giờ đang bối rối. khi nào bắt công việc? –