2011-11-13 10 views
26

Scala'ya taşıdığım ancak hala işlevselliği uygulayan bazı Java alt sınıfları olan bir Java sınıfım var.Scala'da Java korumalı bir yöntem oluşturabilir miyim?

orijinal Java Scala

için

public class Fred extends Base { 
    ... 
    protected Foo getFoo() { 
     return foo; 
    } 
} 

Şimdi ben liman Bankası uzatıldı

public abstract class Base { 
    ... 
    protected abstract Foo getFoo(); 
} 

vardı
class Base { 
    ... 
    protected def getFoo(): Foo 
} 

derleyici şikayet olduğunu

kuralları kurnazca farklı olduğu için, Scala derleyici yerine byte görünürlüğünü zorlamak eğiliminde olduğunu getFoo böylece

,


şimdi anlıyorum ... kalıtsal yöntemin görünürlüğünü azaltmak olamaz javap'd sınıfında herkese açık olarak işaretlendi. Ben görünürlük aynı olması gerektiğini düşünüyorum rağmen Ama

protected[packagename] def getFoo() 

hala bir hakiki (Java) korumalı yöntemi oluşturmaz.

Scala derleyicisini Java'nın korumayı düşündüğü bir yöntemi yaymaya ikna etmenin bir yolu var mı?

+0

Yetkili bir 'Hayır' kabul edeceğim –

+0

Mükemmel bir soru. Bu sayfaya ulaşmadan önce aynı yolu takip ettim. – ebruchez

cevap

2

sen sadece bu kod altında aslında eğer (Scala tüm alt sınıfları dönüştürmek en az kadar, istenilen soyut korumalı yöntemleri vardır bir Java üst sınıf iki Java uygulamaları arasında sandviç Scala yaratabilecek Eğer senin kontrol). Ama ... Daha iyi bir yolu var umut

EDIT yapın: Başka bir seçenek annotation processing tool gibi baytkodu Rewriter çeşit kullanmaktır.

+3

Bu aşağılık bir plan, ama gördüğüm en iyisi! Aslında alt sınıflar benim kontrolüm altındadır, bu yüzden getFoo'nun uygulamalarını kamuya değiştirebilirim, ancak bu ilginç bir soru gibi görünüyordu. –

+0

@DuncanMcGregor: Evet, biliyorum. Başka bir seçenek eklendi ... –