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

标签 java generics return-type

引用下面的代码片段,我有一个接口(interface)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();
    }
}

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

// 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?
}

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

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

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

最佳答案

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

这很丑陋并且强制方法的调用者强制转换:

Splitter<Company, Department> split = (Splitter<Company, Department>) getSplitter("dummyKey");

一个更好的方法是使用携带类型信息的键,通常的方法是使用 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
}

然后调用者可以做:

Splitter<Company, Department> split = getSplitter(Company.class, Department.class);

关于java - java中泛型实现的返回类型应该是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29696678/

相关文章:

java - Android 截图 - 部分黑色谷歌地图

java - 如何在java中序列化列表?

java - 显示窗口但不显示按钮

java - 如何更改selenium中的表数据

java - 对扩展现有枚举类型的泛型感到困惑

java - 实例化并应用未知泛型类型的泛型方法 - Java

c++ - 在 Eigen 3.1.0-alpha1 中返回稀疏矩阵

java - 如何将泛型转换为 Class<T>?

C++ 无法使用 vector<string> 作为返回类型

c++ - C++ 协方差何时是最佳解决方案?