1

我在编译我的代码时遇到了一些问题。

$ mvn clean compile 

像这样的错误通知我。

[58,30] type parameters of <D,K>D cannot be determined; no unique maximal instance exists for type variable D with upper bounds DS,

也许这个问题是由recursive bounds of generic types. 正确的?

参考: 泛型在 Eclipse 中编译和运行,但在 javac 中不编译

我该如何解决这个问题?

@SuppressWarnings("unchecked")
public static <D extends DataStore<K, T>, K, T extends Persistent> D createDataStore(Class<T> persistent, Properties properties) throws IOException {
    try {
        return (D) (new HBaseStore<K, T>());
    } catch (Exception e) {
        throw new RuntimeException("cannot initialize a datastore", e);
    }
}

public static <DS extends DataStore<U, P>, U, P extends Persistent> DS createDataStore(Class<P> persistent) throws IOException {
    return createDataStore(persistent, null); // ERROR
}
4

2 回答 2

1

这意味着该类型D仅作为泛型参数存在。例如T可以从方法参数中解析Class<T> persistent。如果将方法的签名更改为以下内容,则可以解决此问题:

public static <D extends DataStore<K, T>, K, T extends Persistent> D createDataStore(Class<T> persistent, Class<D> dataStoreType, Properties properties)
于 2012-10-16T08:09:30.450 回答
0

当参数类型没有为编译器提供足够的信息来推断泛型类型参数时,您可以显式地提供类型参数。对于非静态方法,您会说this.<list of type parameters>methodName(...). 对于像这样的静态方法,您放置类名而不是this

public static <DS extends DataStore<U, P>, U, P extends Persistent> DS createDataStore(Class<P> persistent) throws IOException {
    return NameOfThisClass.<DS, U, P>createDataStore(persistent, null); // ERROR
}
于 2012-10-16T09:43:10.810 回答