2012-05-22 32 views
5

Tôi muốn có lớp functor như thế này:lớp generic functor trong java

public class Functor<T, R> { 
    public R invoke(T a) { ... } 
} 

Và lớp khác cho 2 đối số:

public class Functor<T1, T2, R> { 
    public R invoke(T1 a, T2 b) { ... } 
} 

Và vân vân.

Trong C# tôi có thể viết:

class Functor<T> { ... } 
class Functor<T1, T2> { ... } 

Nhưng trong Java nó sẽ là một lỗi:

The type Functor is already defined 

gì là thực hành tốt nhất cho đa đối số lớp chung trong java?

+0

Không phải là câu trả lời cho câu hỏi của bạn - nhưng bạn có biết các thư viện như http://functionaljava.org/ sẽ cung cấp cho bạn một bộ hộp thư viện cộng với một thư viện phong phú được xây dựng xung quanh chúng không? – henry

Trả lời

5

Vì Generics được thực hiện bằng Java bằng cách xóa thông tin loại (trong class C<T>, T biến mất trong tệp .class đã biên dịch), không có cách nào để trình biên dịch biết bạn đang nói về lớp nào khi chạy.

Nếu bạn xác định F<T1>F<T1,T2> và tải cả hai, một số loại C, không thể xác định được loại quảng cáo bạn muốn sử dụng.

Đây là một chặng đường dài xung quanh nói, tôi không nghĩ rằng bạn có thể làm điều đó trong Java. : \

Những gì bạn có thể muốn làm chỉ đơn giản là có một cuộc tranh luận functor đơn F<T> và để T là đối tượng, một đối tượng Pair<T1, T2>, một, vv ThreeTuple<T1, T2, T3> Scala thực hiện điều này.

+1

cảm ơn! và những gì thực hành tốt nhất cho các lớp chung đa đối số trong java? – user1312837

+0

Tôi vừa chỉnh sửa câu trả lời để bao gồm nó. Trong ngắn hạn trong F T trở thành một loại đối số chứa 1 hoặc 2 hoặc 3 ... N loại cho đầu vào của bạn. Ví dụ: F >. – Sam

+0

@sam - Mẹo định dạng: bạn có thể sử dụng backticks (\ ') để đính kèm định dạng mã nội tuyến, do đó bạn không phải lo lắng về việc sử dụng < v.v. Điều đó hoạt động trong cả bài đăng và nhận xét. Oh và +1 –

0

Tại sao bạn gọi nó là một hàm? Nếu bạn kiểm tra định nghĩa của functor trong wikipedia, bạn sẽ thấy đây là một thuật ngữ sai.

Trong Scala, đây được gọi là Hàm; và do các chi tiết cụ thể của jvm và bytecode, có rất nhiều phiên bản, tùy thuộc vào sự nổi bật: Function0<Res>, Function1<T1, Res>, Function2<T1,T2, Res>, v.v., lên đến Function22.

+1

Không trả lời câu hỏi - phải là nhận xét. –

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