Java泛型重构和歧义

时间:2010-08-12 13:47:16

标签: java generics refactoring

我在Java1.5之前有一个旧的无类型类,需要使用Java Generics重构它以在代码中获得更多的类型安全性。

旧代码如下所示:

class Foo { 
  void setInput(Object input) {...}
}

现在这个输入可能是某个对象,但它也可能是一个数组,令人讨厌的东西。制作它的通用版本似乎并非无足轻重,我试过:

class Foo<E> {
  void setInput(E input) {...}
  void setInput(E[] input) {...}
}

问题是,这对于调用来说是不明确的:

Foo f = Foo<SomeClassyClass>();
f.setInput(null);

这个问题是否有一些很好的解决方案,还是我需要采取完全不同的方法?

谢谢, 帕特里克

2 个答案:

答案 0 :(得分:6)

这种模糊性对于泛型并不是新的,但总是会出现重载方法。你必须施展null

Foo<String> f = new Foo<String>();

f.setInput((String[]) null);
f.setInput((String) null);

答案 1 :(得分:1)

在这种特殊情况下,你可以这样做:

Foo<SomeClassyClass> f = new Foo<SomeClassyClass>();
f.setInput((SomeClassyClass)null);

或:

Foo<SomeClassyClass> f = new Foo<SomeClassyClass>();
f.setInput((SomeClassyClass[])null);

解决这个问题。