-3

リソース クラス タイプに依存する Mapper インターフェースのジェネリック ファクトリを構築しようとしています。

コードは次のとおりです。

public interface Resource { }

public class IntegerResource implements Resource { }

public class IntegerMapper implements Mapper<IntegerResource> {

}

    public static <R extends Resource> Mapper<R> buildMapper(Class<R> clazz){
        if (IntegerResource.class.equals(clazz)){
            return new IntegerMapper();//Compilation error: Type mismatch: cannot convert from IntegerMapper to Mapper<R>

        }
        return null;
    }

    public <R extends Resource> R getResource(Class<R> clazz){
        Mapper<R> m = buildMapper(clazz);
        return null;
    }
4

1 に答える 1

4

クラスのインスタンスを構築するには、キーワードを使用する必要がありますnew:

return new IntegerMapper();

clazz編集:コンパイラは、 が IntegerResource クラスである場合、R が IntegerResource 型を表すことを知るほど賢くもありません。したがって、明示的にキャストする必要があります。

@SuppressWarnings("unchecked")
public static <R extends Resource> Mapper<R> buildMapper(Class<R> clazz){
    if (IntegerResource.class.equals(clazz)){
        return (Mapper<R>) new IntegerMapper();
    }
    return null;
}

SuppressWarning ビットは、このキャストが安全であることを知っており、それについて警告を出すべきではないことをコンパイラに伝えるためにあります。

于 2013-03-12T17:41:22.407 に答える