2012-03-30 20 views
8

Có cách nào tiến thẳng để triển khai phương thức có chữ ký sau không? Tối thiểu, việc triển khai sẽ cần phải xử lý các loại nguyên thủy (ví dụ: Double và Integer). Các loại phi nguyên thủy sẽ là một phần thưởng tốt đẹp.java generic Chuỗi để <T> trình phân tích cú pháp

//Attempt to instantiate an object of type T from the given input string 
//Return a default value if parsing fails 
static <T> T fromString(String input, T defaultValue) 

Triển khai sẽ không quan trọng đối với các đối tượng triển khai giao diện FromString (hoặc tương đương), nhưng tôi chưa tìm thấy bất kỳ thứ gì như vậy. Tôi cũng đã không tìm thấy một thực hiện chức năng sử dụng sự phản chiếu.

+0

Tại sao bạn cố trả về ' T' thay vì chỉ' T'? – Makoto

+0

@Makoto Đây là một phương pháp chung. '' khai báo biến kiểu cho phương thức. Kiểu trả về được khai báo đơn giản là 'T'. – erickson

+0

Đủ công bằng. Bây giờ tôi hiểu, cảm ơn. – Makoto

Trả lời

5

Chỉ có thể nếu bạn cung cấp Class<T> làm đối số khác. Bản thân số T không chứa bất kỳ thông tin nào về loại trả về mong muốn.

static <T> T fromString(String input, Class<T> type, T defaultValue) 

Sau đó, bạn có thể tìm loại theo type. Một ví dụ cụ thể có thể được tìm thấy trong this blog article.

+2

Có, loại sẽ là cần thiết, trừ khi API yêu cầu 'defaultValue' là không null. –

+0

@DilumRanatunga Bạn có thể xây dựng? Tôi có thể thấy cách truyền một giá trị null sẽ làm cho suy luận kiểu không thể, nhưng tôi không thấy nó giải quyết vấn đề xác định kiểu cụ thể nào của T. – cqcallaw

+1

Sử dụng 'defaultValue.getClass()' để lấy kiểu như ' Lớp '. – BalusC

1

Bạn muốn một đối tượng phân tích cú pháp một loại cụ thể theo một cách cụ thể. Rõ ràng là không thể xác định cách phân tích một loại tùy ý chỉ từ loại. Ngoài ra, bạn có thể muốn kiểm soát cách phân tích cú pháp được thực hiện. Ví dụ, dấu phẩy có số không. Nên khoảng trắng được cắt?

interface Parser<T> { 
    T fromString(String str, T dftl); 
} 

Độc Tóm tắt Phương pháp loại hy vọng sẽ có ít tiết để thực hiện trong Java SE 8.

+0

May mắn thay, việc kiểm soát tốt các cơ chế phân tích cú pháp là không cần thiết cho các mục đích của tôi. Đủ để quay lại giá trị mặc định nếu phân tích cú pháp không thành công. – cqcallaw

0

Có lẽ không trả lời câu hỏi làm thế nào để thực hiện các giải pháp, nhưng có một thư viện mà chỉ này (tức là có gần như một API giống hệt như được yêu cầu). Nó được gọi là type-parser và có thể được sử dụng như sau:

TypeParser parser = TypeParser.newBuilder().build(); 

Integer i = parser.parse("1", Integer.class); 
int i2 = parser.parse("42", int.class); 
File f = parser.parse("/some/path", File.class); 

Set<Integer> setOfInts = parser.parse("1,2,3,4", new GenericType<Set<Integer>>() {}); 
List<Boolean> listOfBooleans = parser.parse("true, false", new GenericType<List<Boolean>>() {}); 
float[] arrayOfFloat = parser.parse("1.3, .4, 3.56", float[].class);