1

ジェネリック Base クラスを返すファクトリ メソッドをジェネリック化しようとしています。動作しますが、「BaseClass is a raw type...」という警告が表示されます。

ジェネリック メソッドに関する Java ドキュメントを読みましたが、これを達成する方法がまだよくわかりません。

ここにいくつかのコードがあります:

クラス #1

//base abstract class
public abstract class BaseFormatter<T>
{
    public abstract String formatValue(T value);
}

クラス#2

//two implementations of concrete classes
public class FooFormatter extends BaseFormatter<Integer>
{
    @Override
    public String formatValue(Integer value)
    {
        //return a formatted String
    }
}

クラス #3

public class BarFormatter extends BaseFormatter<String>
{
    @Override
    public String formatValue(String value)
    {
        //return a formatted String
    }
}

別のクラスのファクトリ メソッド

public static BaseFormatter getFormatter(Integer unrelatedInteger)
{
    if (FOO_FORMATTER.equals(unrelatedInteger))
        return new FooFormatter();
    else if (BAR_FORMATTER.equals(unrelatedInteger))
        return new BarFormatter();
    //else...
}

コード内の別の場所からファクトリ メソッドを呼び出す

BaseFormatter<Integer> formatter = getFormatter(someInteger);
formatter.formatValue(myIntegerToFormat);

問題は、 getFormatter() メソッドが BaseFormatter が生の型であると警告することです。BaseFormatter など、さまざまなことを試しました。もちろん、呼び出し元のメソッドで宣言された BaseFormatter のように、戻り値の型をジェネリックにする必要があります。

フォーマッタ タイプはクラス タイプに基づいていないことに注意してください。たとえば、すべての Integer 値が FooFormatter でフォーマットされるわけではありません。整数 (または文字列、またはリスト) をフォーマットする方法は 2 つまたは 3 つあります。それがパラメータ unrelatedInteger の目的です。

フィードバックをお寄せいただきありがとうございます。

4

3 に答える 3

0

getFormatterがBaseFormatterで定義されている場合は、次を使用します。

public static BaseFormatter<T> getFormatter(Integer unrelatedInteger)

getFormatterがBaseFormatter以外のクラスで定義されている場合は、次を使用します。

public static BaseFormatter<?> getFormatter(Integer unrelatedInteger)
于 2012-06-23T18:46:56.990 に答える
0

BaseFormatterの型付きパラメーターとunrelatedInteger、メソッドに引数として渡されるの間に接続がないことを実際に言っていますgetFormatter

他の警告が表示されます:

Uncehcked Assignment: BaseFormatter to BaseFormatter<Integer>

この警告は、あなたが示した警告よりも悪いものです。このユーザー コードが を挿入しようとする可能性があることを警告しますBaseFormatter<String>。これBaseFormatter<Integer>は、実行時に失敗した場合にのみ通知されます...ユーザーが誤ってファクトリ メソッドを次のように使用したとします。

BaseFormatter<Integer> myUnsafeFormatter =
        FormatterFactory.getFormatter(unrelatedIntegerForBarFormatter);

unrelatedIntegerコンパイラは、 を、返された のパラメーター化された型と関連付けることができませんBaseFormatter

別の方法として、具体的なフォーマッタ コンストラクタを明示的に使用できるようにすることもできます。すべてのフォーマッタで共有される共通コードは、FormatterUtilsクラスに入れることができます (その utils クラスが大きくなりすぎないようにしてください...)。

于 2012-06-23T23:08:51.650 に答える
0

アカデミック言語の型システムの中には、いわゆる従属和を表現できるものがあります。Java は確かにできません。では、getFormatter メソッドによって返されるオブジェクトの型はどのようなものになるのでしょうか? 私たちができる最善のことはBaseFormatter< ? extends Object >、またはBaseFormatter< ? >略してInteger、 共通点Stringのみです。Object

元の投稿では、返すフォーマッタを決定するために整数を使用する必要があるのはなぜですか? また、呼び出し元がフォーマッタのタイプを認識できない場合、呼び出し元は よりも強力な変数タイプを必要とするのはなぜでしょうBaseFormatter< ? >か?

于 2012-06-24T00:58:42.290 に答える