编译代码时遇到一些问题。
$ 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
引起的。正确?
参考文献: Generics compiles and runs in Eclipse, but doesn't compile in 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
}
答案 0 :(得分: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)
答案 1 :(得分: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
}