2013-03-27 36 views
8

Tôi đang cố gắng tìm ra cách để có được generics để nhảy qua hoops.Generics Puzzler

tôi có:

interface Root { } 
interface Middle extends Root { } 
class Type implements Root { } 

Và nhiều "Loại" lớp:

class Subtype1 extends Type implements Middle { } 
class Subtype2 extends Type implements Middle { } 
... 

Những gì tôi muốn là để khai báo một lớp học với hai tham số kiểu TS, nơi T bị ràng buộc bởi TypeS bị ràng buộc bởi TMiddle.

Tôi không thể nhìn thấy một cách có generics để đảm bảo rằng S mở rộng T VÀ triển khai Middle. Những gì tôi muốn là một cái gì đó như:

class Handler<T extends Root, S extends T, S extends Middle>; 

hoặc

class Handler<T extends Root, S extends <T extends Middle>>; 

Nhưng tất nhiên không phải là hợp pháp. Có lẽ có một số phép thuật tôi đang mất tích?

+2

Bạn không thể làm điều này. Bạn có thể có nhiều giới hạn nhưng chúng phải là 0-1 Class cộng với nhiều giao diện. Bạn không thể có kiểu Chung trong một tình huống bị ràng buộc nhiều. Tôi nghi ngờ hạn chế này đã được giữ bởi vì để cho phép loại trong nhiều giới hạn sẽ tạo ra rất nhiều phức tạp để kiểm tra cú pháp, cho một trường hợp cạnh hiếm là gì. – BevynQ

+2

liên quan: http://stackoverflow.com/a/13261667/697449 –

+0

Cảm ơn. Đó là đọc của tôi là tốt, nhưng figured nó đã có thể tôi đã thiếu một cái gì đó trong spec. Hãy sử dụng nó! –

Trả lời

2

Thử giới thiệu lớp trừu tượng mở rộng SubType và triển khai Middle, vì vậy loại của nó có thể được sử dụng trong Handler.

abstract class MiddleSubtype extends Subtype implements Middle { } 

Sau đó,

class Handler<T extends Root, S extends MiddleSubtype> { //... 

EDIT: Sau khi cập nhật cho câu hỏi, ý tưởng cùng sẽ như thế nào:

abstract class MiddleType extends Type implements Middle { } 

class Subtype1 extends MiddleType { } 
class Subtype2 extends MiddleType { } 
... 

class Handler<T extends Root, S extends MiddleType> { //... 
+1

Lưu ý rằng điều này khác với 'T mở rộng Gốc, S mở rộng T ...' mặc dù, vì 'S' không còn bị ràng buộc bởi' T' nữa. –

+0

Có và nó liên kết Trình xử lý với một loại phụ. Tôi thực sự có một loạt các loại phụ có nghĩa là một loạt các trình xử lý cũng là chính xác những gì tôi đã cố gắng để tránh. –

+0

@NickPalmer Xem chỉnh sửa của tôi cho câu trả lời này - Tôi nghĩ điều này gần với những gì rgettman đang đề xuất. –

0

Hoặc bạn có thể làm cho S chung thân:

interface SInt<A,B> {} 
class Handler<T extends Root, S extends SInt<T, Middle>>{}