2015-06-16 30 views
5

Jaki jest odpowiednik Java tych cech w Scali?Jaki jest odpowiednik Java tego kodu Scala?

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 
} 

I przetłumaczyć Strategy cechę do:

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

} 

Staram tłumacząc cechę Visitor do:

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

Jak widać, nie wiem, jak rozumieć/przetłumaczyć typ R w funkcji Visitor. Jaki jest podobny odpowiednik Java?

Odpowiedz

2

Jestem prawie pewien, że nie da się napisać odpowiednika w Javie, jego system typu jest po prostu niezbyt wyrafinowany. R[v <: Visitor] jest wyższe kinded typ rodzajowy i wymagałoby to coś wzdłuż tych linii:

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

ale nie jest to możliwe, aby wyrazić w języku Java, ponieważ nie mają wyższego kinded typów w generycznych. I to nawet nie wspomina o tym, że bit (S{type X = Visitor.this.X;type V=v})#Y jest strukturalnym typem z udoskonaleniem (o ile pamiętam, tak to się nazywa). Nie znam żadnego innego języka poza Scalą, który ma takie coś.

+0

Może moglibyśmy zdefiniować trzeci "interfejs R <.....>" i użyć go w generatorze odwiedzającego? – Stuck

+1

Wątpię, że byłaby to zupełnie inna klasa niż wtedy. Powyższy fragment kodu w Scali nie produkuje nic oprócz 'Visitor' i' Strategy'. Również nie sądzę, że możliwe jest kodowanie wartości domyślnych dla członków typu abstrakcyjnego (może coś działałoby w oparciu o specjalizację częściowych generics, np. 'Interfejs A {}, interfejs B rozszerza A {}', ale wątpię w to także). Tak czy inaczej, system typu Java nie jest wystarczająco silny, by wyrazić te koncepcje. –

Powiązane problemy