Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以用Java';斯威夫特怎么样?_Java_Swift_Oop_Enums - Fatal编程技术网

我可以用Java';斯威夫特怎么样?

我可以用Java';斯威夫特怎么样?,java,swift,oop,enums,Java,Swift,Oop,Enums,是否可以用Java为以下swift代码编写等效代码?事实上,我想知道是否有可能在Java的enum(MyEnum中的X,Y)中有一个函数的案例 这是可能的(从技术上讲),但可能没有那么有用,因为创建一个使用函数实例的简单类 您可能已经知道,在Java中,枚举表示一个或多个相同类型的常量,这些常量可能有自己的属性,包括实例。但是,这些函数实例不能在运行时动态传递,而应该在编译时设置,以便创建常量 当然,只需创建枚举的泛型构造函数,就可以使每个枚举常量具有不同类型的函数: enum MyEnum {

是否可以用Java为以下swift代码编写等效代码?事实上,我想知道是否有可能在Java的enum(MyEnum中的X,Y)中有一个函数的案例

这是可能的(从技术上讲),但可能没有那么有用,因为创建一个使用
函数
实例的简单类

您可能已经知道,在Java中,枚举表示一个或多个相同类型的常量,这些常量可能有自己的属性,包括实例。但是,这些
函数
实例不能在运行时动态传递,而应该在编译时设置,以便创建常量

当然,只需创建枚举的泛型构造函数,就可以使每个枚举常量具有不同类型的
函数

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

    Function<?, ?> function;

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

这将允许您动态地传递
函数
实例,而不是在编译时设置它。

不,您不能;至少,如果您希望在使用枚举时可以使用不同的类型,则不是这样。所有枚举值必须具有相同的类型

当您希望“enum”值具有异构类型时,可以使用具有静态final字段的类:

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

  static final Function<Integer, String> X = ...;
  static final Function<Double, Integer> Y = ...;
}
当然,您没有像
name()
values()
这样的有用方法来迭代此类中的常量,它本身也不可序列化。您可以让自己实现这些-但是对于
values()
您必须在返回类型中使用通配符,以便可以返回所有值:

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

static Iterable当然可以,在java中,枚举可以不仅仅是常量。。。它的每一个值都可以是匿名类(例如查看TimeUnit.class)

现在,您可以执行以下操作:

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));
    }
}
publicstaticvoidmain(字符串[]args){
对于(int i=0;i<100;i++){
System.out.println(Function.LINE.getY(i));
System.out.println(Function.SINE.getY(i));
}
}

这方面的用例是什么?你为什么需要它;或者更确切地说,它们可以是函数,只是不具有不同的输入和输出类型。Java枚举中的所有值都是相同类型的。@AndyTurner枚举的值不能是
对象
类型吗?@nafas枚举值是
对象
s,Java中所有引用类型的实例也是
对象。但它们并不是简单的对象:对于
enum MyEnum{X;Y}
MyEnum.X.getClass()==MyEnum.Y.getClass()==MyEnum.class
,我同意Andy的说法。您可以使用反射或方法句柄执行某些操作,但不会有类型安全性。这样做,每个
案例都会有不同的接口,您如何对这样的事情进行抽象?为什么它会有用?可能是因为我从未使用过swift,但您能展示一个用例吗?我从未使用过swift,但根据上一节,这些参数的值似乎绑定到类似“枚举值的实例”的东西,而不是值本身,这在Java中是不可能的(至少使用枚举)。
static Iterable<Function<?, ?>> values() {
  return Collections.unmodifiableList(Arrays.asList(X, Y));
}
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));
    }
}