Использование Java-дженериков для простой фабрики - Как я могу избежать этих предупреждений - PullRequest
2 голосов
/ 21 февраля 2012

Я пытаюсь понять дженерики должным образом, и я написал очень простую фабрику, но я не могу понять, как обойти эти два предупреждения (у меня были хорошие ошибки, но, вероятно, я не поиск с правильными терминами). Ой! и я не хочу просто подавлять предупреждения - я почти уверен, что можно сделать это правильно .

  • Тип безопасности: конструктор simpleFactory (Class) относится к необработанному типу simpleFactory. Ссылки на универсальный тип simpleFactory должны быть параметризованы
  • simpleFactory является необработанным типом. Ссылки на универсальный тип simpleFactory должны быть параметризованы

Все конструкции, которые я пытался разрешить, на самом деле не компилируются - это, кажется, самое близкое, что я могу получить. Это строка, помеченная ++++, которая генерирует предупреждения (в Eclipse Indigo для проекта Android)

Я понимаю, что вокруг есть несколько отличных объектных фабрик, но речь идет о понимании языка, а не о создании фабрики;)

Вот источник:

import java.util.Stack;

public class simpleFactory<T> {

private Stack<T> cupboard;
private int allocCount;
private Class<T> thisclass;

public static simpleFactory<?> makeFactory(Class<?> facType) {
    try {
        facType.getConstructor();
    } catch (NoSuchMethodException e) {
        return null;
    }
+++++   return new simpleFactory(facType);
}

private simpleFactory(Class<T> facType) {
    thisclass = facType;
    cupboard = new Stack<T>();
}

public T obtain() {
    if (cupboard.isEmpty()) {
        allocCount++;
        try {
            return thisclass.newInstance();
        } catch (IllegalAccessException a) {
            return null;
        } catch (InstantiationException b) {
            return null;
        }
    } else {
        return cupboard.pop();
    }
}

public void recycle(T wornout) {
    cupboard.push(wornout);
}   
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Итак, важной частью является то, что вы действительно хотите захватить тип класса, передаваемого фабричному методу. Я использую тот же идентификатор (T), который скрывает тип класса, что может немного сбить с толку, так что вы можете использовать другой идентификатор.

Вам также нужно создать экземпляр класса с определенным типом, как указано в cutchin.

public static <T> simpleFactory<T> makeFactory(Class<T> facType)
{
    try
    {
        facType.getConstructor();
    }
    catch (NoSuchMethodException e)
    {
        return null;
    }
    return new simpleFactory<T>(facType);
}
0 голосов
/ 21 февраля 2012

Мой предыдущий ответ был полностью нарушен.Это лучший заводской метод.

public static <R> simpleFactory<R> makeFactory(Class<R> facType) {
    try {
        facType.getConstructor();
    } catch (NoSuchMethodException e) {
        return null;
    }
   return new simpleFactory<R>(facType);
}

Использование:

simpleFactory<String> factory = simpleFactory.makeFactory(String.class);
...