2012-06-05 3 views
3

Я хочу расширить класс, который реализован на Java. Вот пример:Как получить доступ к полю суперкласса, который реализован в Java, который также имеет метод с одинаковым именем?

public interface JavaInterface { 
    /** Computes foo. */ 
    public String foo(); 
} 

public class ThisIsJava implements JavaInterface { 
    protected String foo = "foo"; 

    /** Returns value of property foo. */ 
    public String foo() { return foo; } 
} 

Но как я неоднозначность между полем и метод Foo, когда я расширим этот класс в Scala?

class ThisIsScala extends ThisIsJava { 
    def fooBar = super.foo + "/bar" // doesn't compile 
} 
+2

'super.foo()' не работает? – Nicolas

+0

Спасибо всем. Теперь я изменил свой код Scala, чтобы реализовать интерфейс Java напрямую, чтобы обойти эту проблему. Кажется, только рефлексия решит его, но это неприемлемо, потому что оно медленное и невосприимчивое к рефакторингу. –

ответ

7

Вы не можете получить доступ к полю foo, потому что оно личное. Доступ к ней можно получить только по адресу super.foo().

Обновление: Я думаю, у вас есть эта проблема, потому что в Scala нет различия между полями и методами, поэтому единственным вариантом будет иметь адаптер для ThisIsJava и расширить этот адаптер в Scala.

+0

Извините, я виноват: поле действительно защищало доступ. Я соответствующим образом изменил этот пример. –

+0

Вы также можете попытаться использовать отражения, например: this.getClass.getDeclaredField ("foo"). Get (this) .asInstanceOf [String] – tibtof

+0

Хорошо, спасибо, но это связано с штрафом за производительность и невосприимчиво к рефакторингу. –