2014-11-06 168 views
2

在Scala中,你可以定义一个类,因为这:Java的泛型获得类型参数

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。在斯卡拉,如果您尝试MyClass[Int]MyClass[String]将失败,因为IntString不带类型参数。

当然,如果我允许复制一些代码,但可以制作更通用的代码,我认为这是不可或缺的。

+0

@ dimo414你错了。他的意思是:他可以做'class MyClass >'和方法返回'T1 '?你如何在编译时指定'T1'是一个多态类型。 – Jatin 2014-11-06 06:13:07

+0

@贾丁,我究竟是错的?我做了一个事实陈述,即Java使用尖括号来表示泛型,并提供了一些资源来了解更多信息。我没有试图回答这个问题,这就是为什么我发布*评论*而不是*答案*。 – dimo414 2014-11-06 06:21:48

+0

@ dimo414问题中的代码是一个Scala代码,Scala使用方括号。对不起,误导。 @贾丁是对的。我想知道是否可以定义一个像class class MyClass 这样的类。 – JJS 2014-11-06 06:22:42

回答

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的实际实施情况。