2015-07-18 2 views
2

У меня есть интерфейс Java, который использует тип пересечения, как это:типа пересечения с определением типа

public interface JavaIntersection{ 
    public <E extends JComponent & Runnable> void foo(E arg); 
} 

, и я пытаюсь создать класс Scala, который реализует этот интерфейс. Поэтому я написал следующее:

class ScalaIntersection extends JavaIntersection{ 
    override def foo[E <: JComponent with Runnable](arg:E):Unit = ??? 
} 

Это работает, но, в полной программе, которую я пишу, этот тип привыкает в нескольких местах. Привлечение полного типа каждый раз было бы довольно утомительным. Таким образом, я изменил класс вроде этого:

class ScalaIntersection extends JavaIntersection{ 
    type RunnableComponent <: JComponent with Runnable 
    override def foo(arg:RunnableComponent):Unit = ??? 
} 

С этим изменением программы больше не компилирует, со следующими ошибками:

error: class ScalaIntersection needs to be abstract, since method foo in trait JavaIntersection of type [E <: javax.swing.JComponent with Runnable](arg: E)Unit is not defined

error: method foo overrides nothing.
[INFO] Note: the super classes of class ScalaIntersection contain the following, non final members named foo:
[INFO] def foo[E <: javax.swing.JComponent with Runnable](arg: E): Unit

Есть ли способ в Scala для реализации интерфейса метод которого принимает класс, реализующий другой интерфейс, без необходимости писать весь тип для каждого метода?

ответ

4

Эта ошибка возникает из-за того, что вы удалили параметр типа и, следовательно, подпись метода, который вы пытаетесь реализовать. Затем компилятор видит, что вы не реализовали оригинальный метод в вопросе:

error: class ScalaIntersection needs to be abstract, since method foo in trait JavaIntersection of type [E <: javax.swing.JComponent with Runnable](arg: E)Unit is not defined

Вы не можете использовать тип псевдоним, чтобы удалить как имя длинного типа и параметр типа метода которого этот тип является верхней границей (по крайней мере, не с этим синтаксисом). Вместо этого сделайте псевдоним типа точно такого типа пересечения. Я не вижу способа полностью потерять параметр типа, поскольку этот метод требует этого.

class ScalaIntersection extends JavaIntersection { 
    type RunnableComponent = JComponent with Runnable 
    override def foo[E <: RunnableComponent](arg: E): Unit = ??? 
} 
Смежные вопросы