2013-05-19 23 views
10

Tôi đã tự hỏi nếu nó có thể có một cái gì đó như thế này:Có thể có một số lượng biến của các loại phần tử trong một lớp generic java

public class foo<T...> 

vì vậy bạn có thể gọi cho lớp như

Foo<Object0> 
Foo<Object0, Object1> 
Foo<Object0, Object1, Object2> 

Với đối tượng 0, 1 và 2 loại khác nhau, như Integer, Float, String, v.v. Điều này có thể, hoặc tôi sẽ phải viết một lớp cho mỗi chiều dài của các loại chung chung? Nếu điều này là có thể, làm thế nào tôi sẽ xử lý các loại khác nhau?

+0

Tại sao bạn cần điều đó? Hay đó chỉ là sự tò mò? Ví dụ: –

+4

@pivovarit Đối với loại 'Tuple' hoặc cho loại' Có thể gọi 'có chữ ký có thể điều chỉnh. –

+1

@pivovarit ví dụ hiển nhiên mà tôi có thể nghĩ là các loại lớp chung. nói rằng không thể, scala chẳng hạn có các phiên bản của một lớp như vậy với tối đa 15 hoặc nhiều đối số. Pity yes – Voo

Trả lời

5

Không, bạn không thể có điều đó. Điều tốt nhất bạn có thể làm là public class Foo<T extends SomeClassOrInterface>. Vì vậy, trong ví dụ của bạn với IntegerFloat bạn có thể xác định public class Foo<T extends Number>.

Bạn cũng có thể chỉ định rằng T phải triển khai nhiều giao diện.

Cú pháp public class Foo<T extends SomeInterface1 & SomeInterface2> hợp lệ, với & có nghĩa là AND.

Thật không may cú pháp public class Foo<T extends SomeInterface1 | SomeInterface2> với | có nghĩa là OR là không thể.

3

Một lớp học chung được định nghĩa với các định dạng sau:

class name<T1, T2, ..., Tn> { /* ... */ } 

Bạn phải xác định các thông số loại T1, T2 và Tn. Do đó, không thể thực hiện class name<T...>.

1

Bạn đang nói về thông số chung varargs.

Không, bạn không thể. Phần lớn là vì sẽ không có cách nào để tham khảo các loại, trừ khi bạn sử dụng một địa chỉ mảng, chẳng hạn như T[0] v.v., không được hỗ trợ.

Các vấn đề liên quan