有没有办法避免Java的awkard对象转换语法?

SmR*_*Guy 3 java syntax casting

例如,我有一个Object"假装" String:

Object o = new String("dsadsa");
Run Code Online (Sandbox Code Playgroud)

如果我想使用该对象的String函数,首先我必须将它转换为如下字符串:

((String)o).indexOf("sad");
Run Code Online (Sandbox Code Playgroud)

当有这么多括号时,这变得非常烦人且难以理解!特别是当它必须进入IF语句或函数时!

if (((String)o).equals("dsadsa")) {}
Run Code Online (Sandbox Code Playgroud)

避免这种情况的最佳方法是什么?

Den*_*ret 9

解决方案是确保您的对象之前是精确的类,例如在方法的原型中.

这是最佳实践,因为它还有助于避免运行时错误.

参数化类(泛型)越来越容易.

否则说:如果您的代码中有很多强制转换,可能存在设计问题.但我们需要更多代码来提出解决方案.


hca*_*ver 8

将对象放在一行中.

在另一行中使用铸造对象.


biz*_*lop 7

在实践中,正确使用泛型可以摆脱以前在代码中看到的大多数强制转换.

但是如果由于某种原因你不能这样做(较旧的Java版本,遗留库),那么创建一个局部变量,你可以尽早进行演员.

一种特殊情况是将对象从接口类型转换为其实现.这几乎总是错误的,意味着界面设计糟糕.


Mar*_*nik 5

标准的做法是始终捕捉对象插入到窄类型的变量,你的情况一个String str变量,使用之后.

请注意,在您的第三个示例中,您不需要向下转换:o.equals(o2)也可以.

如果您决定学习Java Generics,您很快就会感到失望:通常他们只是将详细程度从向下转换为类型声明.在重写为泛型时,许多代码片段都是长的,有些甚至更长.