2016-12-08 5 views
1

私は1つのタイプを取るジェネリッククラスを持っており、そのタイプのパラメータを持っています。問題は、このパラメータからメソッドを使用する必要があることです(私の問題では、getTimestampメソッドを使用する必要があります)。 私は、ある時点で、タイプが私が変更できないJavaクラスになることを知っているので、私は特性や抽象クラスを持つことができません。スカラ - メソッドでユーザタイプを作成

私はこのような何か試してみました:

type InputWithTimestamp = {def getTimestamp: Long} 

class Foo[Input <: InputWithTimestamp](f : Input) { 
    def printTimestamp = { println(f.getTimestamp) } 
} 

class Test(timestamp : Long) { 
    def getTimestamp = timestamp 
} 

val t = new Test(1000) 

val f = new Foo(t) 
f.printTimestamp 

をそして、それは完璧に働いています。

しかし、私が言ったように、ある時点では、Javaクラスを型として使用する必要があります。

そして、ここに私の問題です:

Javaクラスが長いを返すメソッドgetTimestampを定義した場合でも、私は次のエラーを持っている:

Error: inferred type arguments [MyJavaClass] do not conform to class Foo's type parameter bounds [Input <: InputWithTimestamp] 

だから私はジェネリックを持っているために何を行うことができます私のJavaクラスを変更することなくこのメソッドを定義した型?

+0

'MyJavaClass'は、特に' getTimestamp'メソッドはどのように定義されていますか? 'Long'はデフォルトで' scala.Long'であり、 'java.lang.Long'ではないので、Javaクラスが' java.lang.Long'を返した場合、それは不一致です。 – Jesper

+0

これは私が思ったものですが、私は変更によってテストしましたが、問題はそこから来ていません。 しかし、私はちょうど解決策を見つけました。タイプInputWithTimestamp = {def getTimestamp():Long} 'に括弧を追加するだけでよいです。 –

+0

あなた自身の質問にアンカーとして投稿することができます。あなた自身の質問](http://stackoverflow.com/help/self-answer)を参照してください。この質問と回答を将来見つけた人にとっては、役に立つかもしれません。 – Jesper

答えて

2

私の場合の問題は、私のメソッドgetTimestampを宣言するために括弧を使用しなかったことです(これを行うとIDEAで警告が表示されるためです)。

しかし、その場合には、私は括弧、完璧に動作

Scalaの方法

type InputWithTimestamp = {def getTimestamp: Long} 
と一致していない getTimestampそうでないJavaメソッドを必要とします。

関連する問題