什么应该是java中泛型类型实现的返回类型

Vin*_*t89 1 java generics return-type

参考以下代码片段,我有一个接口Splitter,它接受泛型类型参数TV.有一个实现是CompanySplitterImpl.可能有许多这样的实现.

public interface Splitter<T, V> {
    V[] split(T arg);
}

public class CompanySplitterImpl
implements Splitter<Company, Department> {

    @Override
    public Department[] split(Company comp) {

        return comp.getDepartment();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个工厂方法,该方法根据传递给工厂方法的关键参数值返回不同的实现.

// Factory method to return different Implementation of Splitter
// (Is Splitter return type correct?)
public static Splitter getSplitter(String key) {

    return new CompanySplitterImpl(); // Is this correct?
}
Run Code Online (Sandbox Code Playgroud)

我的问题是返回不同实现的实例的正确方式是什么Splitter<K, V>

// Client to call factory method...
// Not sure what will be type argument for Splitter type
Splitter<?> split = getSplitter("dummyKey");
Run Code Online (Sandbox Code Playgroud)

在客户端,Splitter类型的类型参数是什么?

Pau*_*ton 5

Splitter是一种原始类型.你不应该使用原始类型.由于密钥(a String)不携带类型信息,因此无法从传递给的参数中推断出类型参数getSplitter.因此,避免原始类型的唯一方法是制作返回类型Splitter<?, ?>.

这很难看并强制该方法的调用者进行强制转换:

Splitter<Company, Department> split = (Splitter<Company, Department>) getSplitter("dummyKey");
Run Code Online (Sandbox Code Playgroud)

更好的方法是使用带有类型信息的密钥,通常的方法是使用Class<T>对象.

public static <T, V> Splitter<T, V> getSplitter(Class<T> key1, Class<V> key2) {

    if (key1 == Company.class && key2 == Department.class)
        return (Splitter<T, V>) new CompanySplitterImpl();

    // more cases
}
Run Code Online (Sandbox Code Playgroud)

然后调用者可以这样做:

Splitter<Company, Department> split = getSplitter(Company.class, Department.class);
Run Code Online (Sandbox Code Playgroud)