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