Bạn có thể, nếu bạn chuyển loại dưới dạng tham số phương thức.
static <T> List<T> createEmptyList(Class<T> type) {
return new ArrayList<T>();
}
@Test
public void createStringList() {
List<String> stringList = createEmptyList(String.class);
}
Phương pháp không thể genericised trong cùng một cách mà một loại có thể, vì vậy lựa chọn duy nhất cho một phương pháp với một kiểu trả về generic động, đánh máy - phew đó là một :-) mouthful - là để vượt qua trong loại như một đối số.
Để có Câu hỏi thường gặp thực sự tuyệt vời về Generics Java, see Angelika Langer's generics FAQ.
.
.
Follow-up:
Nó sẽ không có ý nghĩa trong bối cảnh này để sử dụng đối số mảng như trong Collection.toArray(T[])
. Lý do duy nhất một mảng được sử dụng có bởi vì cùng một mảng (được phân bổ trước) được sử dụng để chứa các kết quả (nếu mảng đủ lớn để phù hợp với tất cả chúng). Điều này tiết kiệm trên phân bổ một mảng mới tại thời gian chạy tất cả các thời gian.
Tuy nhiên, với mục đích giáo dục, nếu bạn đã muốn sử dụng gõ mảng, cú pháp là rất giống nhau:
static <T> List<T> createEmptyList(T[] array) {
return new ArrayList<T>();
}
@Test
public void testThing() {
List<Integer> integerList = createEmptyList(new Integer[ 1 ]);
}
Cheekysoft giải thích tại sao, nhưng nếu bạn thực sự cảm thấy cần phải thêm các loại def thứ hai, chỉ cần thêm tên lớp trước khi gọi hàm tĩnh: Danh sách myList = MyClass. createEmptyList(); –