2015-06-16 18 views
5

Tương đương Java của những đặc điểm này trong Scala là gì?Java tương đương với mã Scala này là gì?

trait Visitor { 
    type X 
    type S<:Strategy 
    type R[v<:Visitor] = (S{type X = Visitor.this.X;type V=v})#Y 
} 

trait Strategy { 
    type V<:Visitor 
    type X 
    type Y 
} 

tôi dịch Strategy đặc điểm để:

public interface Strategy<V extends Visitor<?, ?, ?>, X, Y> { 

} 

tôi cố gắng dịch đặc điểm Visitor tới:

public interface Visitor<X, S extends Strategy<?,?, ?>, R ?????> { 
} 

Như bạn thấy, tôi không biết làm thế nào để hiểu/dịch nhập R trong đặc điểm Visitor. Tương đương Java tương tự là gì?

Trả lời

2

Tôi khá chắc chắn rằng không thể viết tương đương trong Java, hệ thống kiểu của nó không đủ tinh vi. R[v <: Visitor] là một kiểu generic cao kinded và nó sẽ đòi hỏi một cái gì đó dọc theo những dòng:

interface Visitor<X, S extends Strategy<?, ?, ?>, R<? extends Visitor<?, ?, ?>> extends ...> 

nhưng điều này là không thể diễn tả bằng Java vì nó không có các loại cao kinded trong Generics. Và điều đó thậm chí còn không nhắc đến rằng (S{type X = Visitor.this.X;type V=v})#Y bit là một kiểu cấu trúc với sự tinh tế (theo như tôi nhớ, nó được gọi như thế này). Tôi không biết bất kỳ ngôn ngữ nào khác ngoại trừ Scala có thứ như vậy.

+0

Có lẽ chúng tôi có thể xác định giao diện thứ ba 'giao diện R <.....>' và sử dụng điều này trong Tổng quan khách truy cập? – Stuck

+1

Tôi nghi ngờ nó, nó sẽ là một lớp hoàn toàn khác sau đó. Đoạn mã trên ở Scala không tạo ra gì ngoài 'Visitor' và' Strategy'. Ngoài ra tôi không nghĩ rằng nó có thể mã hóa giá trị mặc định cho các thành viên kiểu trừu tượng (có thể một cái gì đó dựa trên chuyên môn generics một phần sẽ làm việc, như 'giao diện A {}, giao diện B mở rộng A {}', nhưng tôi nghi ngờ nó quá). Dù bằng cách nào, hệ thống kiểu Java cũng không đủ mạnh để thể hiện các khái niệm này. –

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