3

在 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不采用类型参数。

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

4

1 回答 1

1

在 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实际实施的方式。

于 2014-11-06T08:39:59.113 回答