2016-09-01 18 views
4

次のスウィフトコードで同等のコードをJavaで記述することはできますか?実際に、私はそれがJavaの列挙型(MyEnumでX、Y)内の関数の場合を持つことが可能かどうかを知りたいSwiftのようなJavaのEnumで関数型を使用できますか?

enum MyEnum{ 
    case X((Int) -> String) 
    case Y((Double) -> Int) 
} 
+2

:例えばクラス)

今、あなたは次のように気にいらを行うことができますか?なぜあなたはそれを必要としますか? – hahn

+1

いいえ。むしろ、それらは関数である可能性があります。異なる入力と出力の型ではありません。 Java enumのすべての値は同じ型です。 –

+0

@AndyTurnerは 'Object'型の列挙型の値ではありませんか? – nafas

答えて

2

それは(技術的に)可能であるが、それは作成など、その有用ではないかもしれません単純なクラスで、Functionインスタンスを消費します。

すでにご存じのように、Javaでは、列挙型は同じタイプの定数を1つ以上表示します。これは独自のプロパティを持つことができます。これにはインスタンスが含まれます。ただし、これらのFunctionインスタンスは、実行時に動的に渡すことはできませんが、コンパイル時に設定して定数を作成する必要があります。

はもちろん、あなたがそれぞれの列挙型定数は、単に一般的な列挙型のコンストラクタを作成することによって、異なった型指定されたFunctionを持たせることができます:

enum MyEnum { 
    X((String x) -> "Hello"), Y((Double d) -> 1); 

    Function<?, ?> function; 

    MyEnum(Function<?, ?> function) { 
     this.function = function;  
    } 
} 

これは、しかし、非常に有用ではありません(それがうまくコンパイルが)。 FunctionXは、Stringパラメータを使用せず、固定値を返します。それでYのものもそうです。これは、あなたが動的に代わり、コンパイル時にそれを設定するので、Functionインスタンスを渡すことができるようになります

class Instance<T, U> { 

    private Function<T, U> function; 

    public Instance(Function<T, U> function) { 
     this.function = function; 
    } 
} 

私はむしろ、同じクラスの2つの別々のインスタンスを紹介したいです。

+0

Swiftを使用したことはありませんでしたが、[関連付けられた値](https://developer.apple.com/library) /mac/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html)、これらのパラメータの値は、値そのものではなく、 "enum値のインスタンス"のようなものにバインドされているように見えます。少なくともenumを使用して)。 –

3

いいえ、できません。列挙型を使用するときに異なる型を使用できるようにしたい場合は、少なくともそうではありません。すべての列挙型の値は同じ型でなければなりません。

final class MyHeterogeneousEnum { 
    private MyHeterogeneousEnum() {} // Not instantiable. 

    static final Function<Integer, String> X = ...; 
    static final Function<Double, Integer> Y = ...; 
} 

あなたは彼らの完全な型情報を使用して値を使用することができます::

String s = MyHeterogeneousEnum.X.apply(123); 
Integer i = MyHeterogeneousEnum.Y.apply(999.0); 

あなたは異質なタイプを持っているために、「列挙型」の値は、あなたがのstatic finalフィールドを持つクラスを使用することができますしたい

もちろん、name()、またはvalues()のような有用なメソッドがこのクラスの定数を反復処理するわけではなく、本質的にシリアライズ可能でもありません。

static Iterable<Function<?, ?>> values() { 
    return Collections.unmodifiableList(Arrays.asList(X, Y)); 
} 

しかし、かなりワイルドカード入力型パラメータを持つFunctionであることに注意してください。しかしvalues()のためにあなたはすべての値を返すことができるようにするために、戻り値の型でワイルドカードを使用する必要があります - あなたはこれらを自分で実装することができます多くの役に立たない:あなたは実際にそれに何かを渡すことはできません(null以外)。 values()メソッドには、ユーティリティが限られています。

1

確かに可能ですが、java列挙型ではそれ以上の定数になる可能性があります。各値は匿名クラスになります(TimeUnitを見てください)。このためユースケースは何

interface IFunction { 
    double getY(double x); 
} 


enum Function implements IFunction { 
    LINE { 
    @Override 
    public double getY(double x) { 
     return x; 
    } 
    }, 
    SINE { 
    @Override 
    public double getY(double x) { 
     return Math.sin(x); 
    } 
    } 
} 

、次に実装

public static void main(String[] args) { 
    for (int i = 0; i < 100; i++) { 
     System.out.println(Function.LINE.getY(i)); 
     System.out.println(Function.SINE.getY(i)); 
    } 
} 
関連する問題