Рефакторинг и неоднозначность Java Generics - PullRequest
1 голос
/ 12 августа 2010

У меня есть старый нетипизированный класс, предшествующий Java1.5, и мне нужно провести его рефакторинг с использованием Java Generics для большей безопасности типов в коде.

Старый код выглядит так:* Теперь этот вход может быть каким-то объектом, но он также может быть массивом, неприятными вещами.Создание общей версии кажется не тривиальным, я попытался:

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

Проблема в том, что это неоднозначно, например, для вызовов:

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

Есть ли какое-то хорошее решениек этой проблеме или мне нужно использовать совершенно другой подход?

Спасибо, Патрик

Ответы [ 2 ]

6 голосов
/ 12 августа 2010

Этот тип неоднозначности не нов для дженериков, но всегда может случиться с перегруженными методами. Вы должны разыграть null:

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

f.setInput((String[]) null);
f.setInput((String) null);
1 голос
/ 12 августа 2010

В этом конкретном случае вы можете сделать:

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

или:

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

Чтобы устранить неоднозначность.

...