Tôi có một bộ các lớp chung chung khá phức tạp trong Java. Ví dụ, tôi có một giao diệnGõ bí danh cho các Generics Java
interface Doable<X,Y> {
X doIt(Y y);
}
và thực hiện
class DoableImpl implements Doable<Foo<Bar<Baz,Qux>>,Foo<Bar<Zot,Qux>>> {
Foo<Bar<Baz,Qux>> doIt(Foo<Bar<Zot,Qux>> fooBZQ) { ... }
}
Trong việc thực hiện thực tế, Doable
có khá một vài phương pháp và vì vậy Foo<Bar<Baz,Qux>>
vv, xuất hiện hơn và hơn nữa. (Tin tưởng rằng nó hay không, các loại chung chung là khá một chút đau đớn hơn này. Tôi đã đơn giản hóa chúng cho ví dụ này.)
Tôi muốn đơn giản hóa chúng, để tiết kiệm bản thân mình đánh máy và để giảm bớt căng thẳng trên mắt tôi. Điều tôi muốn là có một "bí danh loại" đơn giản cho Foo<Bar<Baz,Qux>>
, v.v., nói FooBBQ
và FooBZQ
.
ý tưởng hiện tại của tôi là xác định các lớp wrapper:
class FooBBQ {
public static FooBBQ valueOf(Foo<Bar<Baz,Qux>> fooBBQ) {
return new FooBBQ(fooBBQ);
}
private Foo<Bar<Baz,Qux>> fooBBQ;
private FooBBQ(Foo<Bar<Baz,Qux>> fooBBQ) {
this.fooBBQ = fooBBQ;
}
public Foo<Bar<Baz,Qux>> toGeneric() {
return fooBBQ;
}
}
class FooBZQ { /* pretty much the same... */ }
class DoableImpl implements Doable<FooBBQ,FooBZQ> {
FooBBQ doIt(FooBZQ fooBZQ) { ... }
}
này hoạt động tốt, nhưng nó có một vài hạn chế:
- Chúng ta cần phải xác định giấy gói riêng biệt cho mỗi trường hợp tổng quát. Các lớp bao bọc là ngắn và cách điệu, nhưng tôi không thể tìm ra cách để đóng băng chúng.
Chúng tôi có phí dịch thuật (khái niệm, nếu không hoạt động) gọi
valueOf
vàtoGeneric
để chuyển đổi giữaFooBBQ
vàFoo<Bar<Baz,Qux>>
. Ví dụ, nếudoIt
cuộc gọi vào một số thói quen thư viện mà hy vọng mộtFoo<Bar<Zot,Qux>>
(mà việc thực hiện thực hiện), chúng tôi kết thúc với một cái gì đó giống nhưreturn FooBBQ.valueOf(libraryCall(fooBZQ.toGeneric()))
nơi chúng tôi sẽ ban đã
return libraryCall(fooBZQ);
Có cách nào khác để có được hành vi "loại bí danh" mà tôi muốn ở đây không? Có lẽ sử dụng một số bộ công cụ macro của bên thứ ba? Hoặc tôi có cần phải chấp nhận rằng tôi sẽ phải làm rất nhiều cách gõ, một cách (sử dụng các loại chung trong việc thực hiện) hay cách khác (viết trình bao bọc cho chúng)? Có lẽ có nhiều thông số chung chung bay quanh đây chỉ là một ý tưởng tồi và tôi cần phải nghĩ lại vấn đề?
[CẬP NHẬT] OK, tôi đang cấm thêm bất kỳ câu trả lời "không làm điều đó". Lấy nó như là một cho rằng Foo<Bar<Baz,Qux>>
có giá trị chính hãng trong lĩnh vực vấn đề của tôi (Pete Kirkham có thể đúng rằng nó có đủ giá trị để có được một lớp wrapper thích hợp với một tên mô tả). Nhưng đây là một vấn đề lập trình; không cố gắng xác định vấn đề.
Tôi sẽ nói 'có thể' đối với người cuối cùng, nhưng không thực sự có bất kỳ phản hồi mang tính xây dựng nào: P Nó trông giống như một mớ hỗn độn! Chúc may mắn! –
Tôi nghĩ câu hỏi này sẽ đưa ra một đề xuất tốt cho Java. Nếu bạn có thể đề xuất tính năng Loại Bí danh cho Oracle, tôi nghĩ đó sẽ là một tính năng ngôn ngữ tuyệt vời sẽ đơn giản hóa ngôn ngữ và làm cho mã nguồn dễ đọc hơn. –
Đầu gối sâu trong Java ngày hôm nay và muốn làm sạch một số mã tiết ... không chỉ làm tôi không nhận được suy luận kiểu, nhưng không có loại bí danh hoặc. * sob * –