2

私はジェネリックを正しく理解しようとしており、非常に単純なファクトリを作成しましたが、これら 2 つの警告を回避する方法がわかりません (私はよくうろつきましたが、おそらく私は正しい条件)。おー!警告を単に抑制したくはありません - これを適切に行うことができるはずだと確信しています。

  • 型の安全性: コンストラクター simpleFactory(Class) は生の型 simpleFactory に属します。ジェネリック型 simpleFactory への参照はパラメータ化する必要があります
  • simpleFactory は生の型です。ジェネリック型 simpleFactory への参照はパラメータ化する必要があります

これを解決しようとしたすべての構成は、実際にはコンパイルに失敗します - これは私が得ることができる最も近いもののようです。警告を生成するのは ++++ とマークされた行です (Android プロジェクトの Eclipse Indigo で)

優れたオブジェクト ファクトリがいくつかあることは認識していますが、これは実際にファクトリを作成することではなく、言語を理解することに関するものです ;)

ソースは次のとおりです。

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 に答える