2

我正在尝试正确理解泛型,并且我编写了一个非常简单的工厂,但是我看不到如何绕过这两个警告(我已经很卑鄙了,但可能我没有在搜索正确的条款)。哦!而且我不想只是禁止警告-我很确定应该可以正确执行此操作。

  • 类型安全:构造函数 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);
}   
}
4

2 回答 2

1

所以重要的部分是你实际上想要捕获传递给工厂方法的类的类型。我使用的是相同的标识符 (T),它隐藏了类的类型,这可能有点令人困惑,因此您可能希望使用不同的标识符。

您还需要使用特定类型实例化该类,例如提到的 cutchin。

public static <T> simpleFactory<T> makeFactory(Class<T> facType)
{
    try
    {
        facType.getConstructor();
    }
    catch (NoSuchMethodException e)
    {
        return null;
    }
    return new simpleFactory<T>(facType);
}
于 2012-02-21T01:17:33.320 回答
0

我之前的回答完全被打破了。这是更好的工厂方法。

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);
于 2012-02-21T00:39:21.660 回答