Java Generic获取类型参数

时间:2014-11-06 06:00:30

标签: java scala generics higher-kinded-types

在Scala中,您可以将此类定义为:

class MyClass[T1[T2]] {
  def abc(a1: T1[Double]):T1[Int] = ???
}

在此代码中,类型参数T1表示需要一个类型参数T2的类型,因此我们可以创建一个类似new MyClass[List]的实例。

我想用Java做这件事,但我不知道。

我想知道在Java中是否可行,如果没有,我想知道如何用Java来做这件事。

根据我的理解,泛型类型基本上是类型的函数。因此,如果您有类似List<T>的类,则可以将类List视为类型函数,因此List采用类似Integer的类型参数,然后它将是类似于整数列表的具体类型(List<Integer>)。

上面的

MyClass采用了类型参数T1,但我希望这个T1也是一个采用类型参数T2的泛型类型,因此我可以创建一个实例与MyClass<List>类似,可以在List<Integer>内使用类似List<Double>MyClass的类型。在Scala中,如果您尝试MyClass[Int]MyClass[String]将失败,因为IntString不接受类型参数。

当然,如果我允许复制某些代码,但是为了制作更通用的代码,这可能没有必要,我认为这是不可或缺的。

1 个答案:

答案 0 :(得分:0)

在Java中使用它的唯一方法是为T1提供一个通用接口。

public interface GenericType<T> {
    // ...
}

然后您可以将您的班级定义为:

class MyClass {
    public GenericType<Integer> abc(GenericType<Double> a1) {
        //...
    }
}

请注意,由于通用接口,您不再需要类级别的任何更多类型参数。然后在调用MyClass.abc之前,您需要将您传递的实例包装在GenericType中。

您还可以更高一个抽象级别并定义

class MyClass<T1,T2> {
    public GenericType<T1> abc(GenericType<T2> a1) {
        //...
    }
}

这样可以更灵活地使用MyClass。但这在很大程度上取决于MyClass实际实现的方式。