Java泛型获取类型参数

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>并在MyClass中使用类型,例如List<Integer>List<Double>。在Scala中,如果尝试MyClass[Int]MyClass[String]将失败,因为IntString不采用类型参数。
当然,如果我允许重复一些代码,这可能并不是必要的,但为了使代码更加通用,我认为这是不可或缺的。

@dimo414 你错了。他的意思是:他能否编写 class MyClass<T1<T2>> 并在方法中返回 T1<Integer>?你如何在编译时指定 T1 是一个多态类型。 - Jatin
@Jatin,我错在哪里了?我提出了一个事实陈述,即Java使用尖括号表示泛型,并提供了一个学习资源。我没有试图回答问题,这就是为什么我发表了一条评论而不是答案的原因。 - dimo414
@dimo414 从你的评论中可以看出,Java使用尖括号表示泛型类型,这意味着你只需要用<>替换[]即可。这是众所周知的。而提供一个通用的泛型教程参考就像提供维基百科页面链接一样,这有什么帮助呢? - Jatin
不,class MyClass<T1<T2>>在Java中无法编译,因为默认编译器只考虑泛型类型中的一个级别。我认为这是一个很好的问题。 - Jatin
啊,我明白了,抱歉,我之前对问题没有完全理解。 - dimo414
显示剩余2条评论
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 的实际实现方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接