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

时间:2012-08-22 15:26:53

标签: java syntax casting

例如,我Object“假装”为String

Object o = new String("dsadsa");

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

((String)o).indexOf("sad");

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

if (((String)o).equals("dsadsa")) {}

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

10 个答案:

答案 0 :(得分:9)

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

这是最佳做法,因为它还有助于避免运行时错误。

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

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

答案 1 :(得分:8)

将对象放在一行中。

在另一行中使用已铸造的对象。

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:5)

标准做法是始终将对象捕获到较窄类型的变量中,在您的情况下为String str变量,然后使用该变量。

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

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

答案 4 :(得分:2)

我假设你打算说你的String冒充Object

你的句柄是Object类型,它不需要。

  1. 如果您使用的是Object类型,因为它是您的方法获得的参数,请考虑将参数类型更改为String,如果您实际需要String。
  2. 如果这来自Collection,请考虑更改Collection以使用Generics,以便您可以将集合定义为String类型。
  3. 如果由于某些原因您无法更改进入的对象的类型,请确认它实际上是一个String,并将其转换为另一个String类型的变量。
  4. 对于第三种选择,这就是代码的样子。

    String s;
    if (o instanceof String) {
        s = (String) o;
    } else {
        s = null;
        throw new IllegalArgumentException();
        // Or take some corrective action.
    }
    

答案 5 :(得分:1)

我不这么认为。您必须显式地为超类强制转换为子类。

String str;

if(o instanceOf String){
   str =(String)o;
   str.indexOf("sad");
   ...
}

答案 6 :(得分:1)

你可以利用像

这样的泛型做一些危险的事情
public static <T> T cast(Object o){
    return (T) o;
}

这允许你做

之类的事情
Object o="";
String s = cast(o);

这真的很酷,但你可以做点像

public static String s(Object o){
    return (String) o;
}

然后

    Object o = "";
    s(o).indexOf("sad");

答案 7 :(得分:1)

我不推荐它,但你可以这样做:

String.class.cast(o).indexOf("sad");

答案 8 :(得分:0)

您似乎不希望编译时类型检查。 然后只使用脚本语言,例如Groovy也可以在JVM上运行,但不需要静态输入。

答案 9 :(得分:0)

"dsadsa".equals(someString)是如何完成的 - 有效消除了NPE的任何机会,并确保即使someString实际上被声明为对象也没有虚拟调用。

此外,您无需强制转换即可致电equals()

除了你可以使用泛型,但它们的语法过于冗长,尤其是<T extends Foo &Bar> T selectFooBared(List<java.lang.ref.Reference<T>> list, Comparator<? super T> c);

之类的东西