Dưới đây là một Java generic mẫu:Java hàm tổng quát: làm thế nào để trả về kiểu Generic
public <T> T getResultData(Class<T> resultClass, other_args) {
...
return resultClass.cast(T-thing);
}
Một cuộc gọi thông thường trông giống như:
DoubleBuffer buffer;
buffer = thing.getResultData(DoubleBuffer.class, args);
Tôi chưa bao giờ có thể tìm ra cách để sử dụng mẫu này một cách sạch sẽ khi kiểu trả về mong muốn là chính nó. Để được 'cụ thể', nếu một chức năng như thế này muốn trả về Map<String,String>
thì sao? Vì bạn không thể có được một đối tượng lớp cho một generic, tất nhiên, lựa chọn duy nhất là để vượt qua Map.class
, và sau đó bạn cần một dàn diễn viên và @SuppressWarning
sau khi tất cả.
Một kết thúc với một cuộc gọi như:
Map<String, String> returnedMap;
returnedMap = thing.getResultData(Map.class, some_other_args);
Bây giờ một là trở lại cần phôi và đàn áp một cảnh báo.
Tôi cho rằng người ta có thể lấy thứ gì đó từ gia đình java.lang.reflect.Type
thay vì số Class
, nhưng những thứ đó không đặc biệt dễ pha trộn. Có vẻ như:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
Với điều này, hàm được gọi có thể trích xuất loại cơ sở và sử dụng để đúc hoặc mớiCung cấp, nhưng trường kinh doanh giả mạo trông có vẻ xấu xí.
Lưu ý rằng các chức năng như thế này không phải lúc nào cũng gọi newInstance
. Rõ ràng, nếu họ làm, họ không cần phải gọi resultClass.cast
.
Ngoại trừ bạn không thể có được và do đó vượt qua thể hiện Class cho lớp chung như 'Bản đồ' do đó điều này sẽ không giúp gì cả với câu hỏi của OP. –
ChssPly76
Yup. Đó chính xác là cách chúng tôi đến đây. – bmargulies
Chúng không được hỗ trợ trong Ngôn ngữ nhưng bạn sử dụng TypeLiteral, được phát minh bởi Neal Gafter. http://gafter.blogspot.com/2006/12/type-literals.html –