Java中的自动类型转换?

有没有办法在Java中进行自动隐式类型转换? 例如,假设我有两种类型,’FooSet’和’BarSet’,它们都是Set的表示。 在类型之间转换很容易,因此我编写了两个实用方法:

/** Given a BarSet, returns a FooSet */ public FooSet barTOfoo(BarSet input) { /* ... */ } /** Given a FooSet, returns a BarSet */ public BarSet fooTObar(FooSet input) { /* ... */ } 

现在说我想调用这样的方法:

 public void doSomething(FooSet data) { /* .. */ } 

但我所拥有的只是一个BarSet myBarSet …它意味着额外的输入,如:

 doSomething(barTOfoo(myBarSet)); 

有没有办法告诉编译器某些类型可以自动转换为其他类型? 我知道这可以在C ++中进行重载,但我找不到Java的方法。 我想能够输入:

 doSomething(myBarSet); 

并且编译器知道自动调用barTOfoo()

答案很简单:在C ++中可能会出现重载,但在Java中无法做到这一点。

您可以重载您的方法,如下所示:

 public void doSomething(FooSet data) { /* .. */ } public void doSomething(BarSet data) { doSomething(barTOfoo(data)); } 

你们可以一起做两件事:

(1)编写在后台进行转换的包装器方法。

(2)如果您的对象具有正确的hashCode overriden方法,则包装器方法可以管理一个非常简单和快速的缓存,您可以使用简单的Map实现自己构建并且可能同步(如果您同时使用这些对象)。

这将使你摆脱两种类型之间的转换,可能是性能问题。 即使你反对缓存,我仍然会建议(如其他海报所说)使用包装方法。 这至少可以节省大量不必要的打字。

祝你好运。

重载以相反的方式工作,您在接收器对象上声明两个方法:

 public void doSomething(FooSet data) { /* .. */ } public void doSomething(BarSet data) { doSomething(barToFoo(data)); } 

然后感谢动态绑定 ( 维基百科 )在运行时选择正确的方法。

当然,Java中的重载是作用于对象级的(因为调用仅限于实例或类声明),但它的工作方式相同。

在你的情况下你可以尝试通过扩展类,如果它在外部库中,因为它是java你应该能够做到,并添加方法或使用reflection ( java教程 )动态添加方法。

不支持自动类型转换(您希望Scala的隐式类型转换 )。

但您可以尝试使用Variant类型作为交换盒来切换类型:

 /** Given a BarSet, returns a FooSet */ public Function barTofoo = new Function() { @Override public FooSet apply(BarSet input) { /* ... */ } } /** Given a FooSet, returns a BarSet */ public Function fooToBar = new Function() { @Override public BarSet apply(FooSet input) { /* ... */ } } /** Create a type conversion context in which both of these conversions are registered */ TypeConversionContext fooBarConversionContext = MatchingTypeConversionContext.builder() .register(FooSet.class, BarSet.class, fooToBar) .register(BarSet.class, FooSet.class, barToFoo) .build(); /** Put a FooSet into a Variant, bound to our type conversion context */ FooSet fooSet = new FooSet(); Variant data = Variant.of(fooSet).in(fooBarConversionContext); /** Pull a BarSet out of the Variant */ public void doSomething(Variant data) { Preconditions.checkArgument(data.isConvertibleTo(BarSet.class); BarSet barSet = data.as(BarSet.class); // ... } 

Java是在考虑可见性的情况下创建的。 每个程序员都应该只能阅读一行,并了解那里发生的事情。 这就是它没有运算符重载的原因,这就是为什么它没有任何类型的自动自定义类型转换。 因此,除非您在其中一个库中编写自己的包装器,它将接受来自其他库的类型并明确地转换它们,否则您运气不好。