2016-05-31 6 views
2

特定のインターフェイスを実装しているインスタンスを取得する必要がありますワンライナークラスのインスタンス実装

1ライナークラスのインスタンス実装を作成することは可能ですか?

+3

インタフェース(それは機能的インタフェースですか?)とその必要な実装です。 – Eran

+4

また、行の長さによって決まります: –

+2

はい。 1行の見た目はインタフェースの複雑さに左右されます。 – khelwood

答えて

6

インタフェースが機能インタフェースである場合、Java 8では、あなたはメソッド参照を経由してラムダ式を介して、または簡単な例でそれを定義することができます(正確に一つの抽象メソッドは、以下を参照してください):

ラムダ:

Runnable runnable =() -> System.out.println("I am a runnable"); 

方法参照:

Predicate<Character> uppercase = Character::isUpperCase; 

注:機能インタフェースはウィットを注釈される必要はありませんh @FunctionalInterfaceのように便利ですが、インターフェイスに注釈を付けるときには、コンパイル時にエラーが発生します(つまり、@FunctionalInterface) 〜@Override)。

参照:

コメントへの

更新応答:

はい、あなたが定義しonelinerでラムダを使用しますが、コンテキストが不明である場合には、明示的なキャストが必要となることができますに依存

// cast required 
System.out.println(((Predicate<Character>) Character::isUpperCase).test('A')); 

// no cast required 
Arrays.asList("foo","bar").forEach(System.out::println); 
Arrays.asList(1,2).forEach(i -> System.out.println(i*2)); 
+0

ちょうど好奇心が強い、そのインスタンスの戻り値を1行に返すことはできますか? –

+3

機能的なインターフェースには** abstract **メソッドが1つしかないと言うだけの方がいいです。これは 'default'メソッドだけでなく' static'メソッドもあるので、無関係なメソッドのさまざまなタイプに注意しないようにしますJava 9では 'private'メソッドが許可されます。これは、' interface'が機能的なインターフェースであるかどうかという疑問とは無関係です。より正確にするために、 'java.lang.Object'で宣言されたメソッドと一致しない抽象メソッドが1つしかないので、2つの抽象メソッドを持つ' Comparator'は依然として機能インターフェースです。 – Holger

+1

@fireflieslive: "1つの行に返されるインスタンスの返り値"が何を意味するのかははっきりしていません。 – Holger

0

場合によっては可能です。例えば :

List<T> list = ... 
Collections.sort(list, (t1, t2) -> compareOperation(t1,t2)); 

functional interface Comparator<T>は、1つの抽象メソッドを含むインタフェースです。 See docs.oracle

関連する問題