Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型获取类型参数_Java_Scala_Generics_Higher Kinded Types - Fatal编程技术网

Java泛型获取类型参数

Java泛型获取类型参数,java,scala,generics,higher-kinded-types,Java,Scala,Generics,Higher Kinded Types,在Scala中,可以将类定义为: class MyClass[T1[T2]] { def abc(a1: T1[Double]):T1[Int] = ??? } 在这段代码中,类型参数T1表示需要一个类型参数T2的类型,因此我们可以创建一个类似newmyclass[List]的实例 我想用Java做这个,但我不知道 我想知道它在Java中是否可行,如果不可行,我想知道如何在Java中实现这一点 根据我的理解,泛型类型本质上是类型的函数。因此,如果您有一个类,如List,您可以将类List视

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

class MyClass[T1[T2]] {
  def abc(a1: T1[Double]):T1[Int] = ???
}
在这段代码中,类型参数
T1
表示需要一个类型参数
T2
的类型,因此我们可以创建一个类似
newmyclass[List]
的实例

我想用Java做这个,但我不知道

我想知道它在Java中是否可行,如果不可行,我想知道如何在Java中实现这一点

根据我的理解,泛型类型本质上是类型的函数。因此,如果您有一个类,如
List
,您可以将类
List
视为类型函数,因此
List
接受一个类型参数,如
Integer
,那么它将是一个具体的类型,如整数列表(
List

上面的
MyClass
接受一个类型参数
T1
,但是我想这个
T1
也是一个接受类型参数
T2
的泛型类型,所以我可以创建一个类似
MyClass
的实例,并且可以在
MyClass
内部使用类似
List
的类型。在Scala中,如果尝试
MyClass[Int]
MyClass[String]
将失败,因为
Int
String
不接受类型参数


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

在Java中实现这一点的唯一方法是为
T1
提供一个公共接口

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

这将使您在使用
MyClass
时更加灵活。但这在很大程度上取决于MyClass的实际实现方式。

@dimo414你错了。他的意思是:他能做
classmyclass
和返回方法
T1
?如何在编译时指定
T1
是多态类型。@Jatin我到底错在哪里?我做了一个事实陈述,Java使用尖括号表示泛型,并提供了了解更多信息的资源。我没有试图回答这个问题,这就是为什么我发布了一条评论而不是答案。@dimo414问题中的代码是Scala代码,Scala使用方括号。对不起,我误导了你@贾丁是对的。我想知道是否可以从您的评论中定义一个类,如
class MyClass
@dimo414
Java使用尖括号表示泛型类型
意味着您试图说只需将
[]
替换为
。大家都知道。提供对
泛型教程的一般参考
就像提供到维基百科页面的链接一样。它有什么帮助?不,
classmyclass
不在java中编译,因为默认情况下编译器只考虑泛型类型中的一个级别。我认为这是一个极好的问题
class MyClass {
    public GenericType<Integer> abc(GenericType<Double> a1) {
        //...
    }
}
class MyClass<T1,T2> {
    public GenericType<T1> abc(GenericType<T2> a1) {
        //...
    }
}