Java 泛型在参数中是如何工作的?
我对泛型是如何工作的有点困惑?我正在学习java中的Java 泛型在参数中是如何工作的?,java,generics,functional-programming,Java,Generics,Functional Programming,我对泛型是如何工作的有点困惑?我正在学习java中的function,在那里我刚刚测试了function接口,对compose方法(泛型如何在compose方法中工作)感到困惑 阅读java官方教程网站上的泛型,我意识到如果我们在方法返回或参数中有任何泛型类型,我们必须在方法签名中声明该类型,如下所述 这是我读到的方法 1)第一个问题T&R在哪里申报?在返回类型和参数中使用的。还是我的理解错了 然后我阅读了泛型教程中的更多内容,然后我试图理解泛型中super和extends的概念,然后我对com
function
,在那里我刚刚测试了function
接口,对compose
方法(泛型如何在compose
方法中工作)感到困惑
阅读java官方教程网站上的泛型,我意识到如果我们在方法返回或参数中有任何泛型类型,我们必须在方法签名中声明该类型,如下所述
这是我读到的方法
1)第一个问题T&R在哪里申报?在返回类型和参数中使用的。还是我的理解错了
然后我阅读了泛型教程中的更多内容,然后我试图理解泛型中super
和extends
的概念,然后我对compose
方法进行了更多测试,然后又对super
和extends
在compose
方法中的工作原理感到困惑
public static void main(String... args){
Function<Integer, String> one = (i) -> i.toString();
Function<String, Integer> two = (i) -> Integer.parseInt(i);
one.compose(two);
}
publicstaticvoidmain(字符串…参数){
函数一=(i)->i.toString();
函数二=(i)->Integer.parseInt(i);
一、撰写(二);
}
如上所述,我用lamdas声明了两个函数。一个是整数输入和字符串输出,另一个是与之相反的
2)第二个问题是Integer
和String
与extends
和super
的关系如何?String
和Integer
类之间没有关系没有人在互相扩展那么它是如何工作的呢
我尽力解释我的问题。告诉我您不明白的地方,我会再试一次。1)编写功能是接口功能的一部分。正如您在该接口的文档中所看到的:
类型参数:
T—函数输入的类型
R-函数结果的类型
2) 问题中的super
和extends
约束不应用于t&R,而是应用于函数的泛型类型参数,您将其作为参数传递给compose
函数
基本上,这意味着如果您有:
Function<ClassA, ClassB> one;
Function<SomeSuperClassOfC, SomeSubclassOfA> two;
功能一;
功能二;
那么打电话是有效的
Function<ClassC, ClassB> three = one.compose(two)
函数三=一。组合(二)
1)组合功能是接口功能的一部分。正如您在该接口的文档中所看到的:
类型参数:
T—函数输入的类型
R-函数结果的类型
2) 问题中的super
和extends
约束不应用于t&R,而是应用于函数的泛型类型参数,您将其作为参数传递给compose
函数
基本上,这意味着如果您有:
Function<ClassA, ClassB> one;
Function<SomeSuperClassOfC, SomeSubclassOfA> two;
功能一;
功能二;
那么打电话是有效的
Function<ClassC, ClassB> three = one.compose(two)
函数三=一。组合(二)
哪里定义了T
和R
请记住,compose
是在函数
界面中声明的。它不仅可以使用自己的泛型参数,还可以使用类型的泛型参数R
和T
在接口声明中声明:
interface Function<T, R> {
...
}
由此,我们可以推断T
是Integer
,R
是String
。什么是V
V
必须是某种类型,以便约束功能在哪里定义T
和R
请记住,compose
是在函数
界面中声明的。它不仅可以使用自己的泛型参数,还可以使用类型的泛型参数R
和T
在接口声明中声明:
interface Function<T, R> {
...
}
由此,我们可以推断T
是Integer
,R
是String
。什么是V
V
必须是某种类型,这样约束函数我将尝试从零开始解释;
接口功能
-这是一个方法接口,必须实现R应用(T)
;
在8之前的Java中,我们必须编写:
Function<Integer, String> one = new Function<Integer, String>() {
@Override
public String apply(Integer i) {
return i.toString();
}
};
现在,我想,你明白了。我将尝试从零开始解释;
接口功能
-这是一个方法接口,必须实现R应用(T)
;
在8之前的Java中,我们必须编写:
Function<Integer, String> one = new Function<Integer, String>() {
@Override
public String apply(Integer i) {
return i.toString();
}
};
现在,我想,你明白了。非常感谢大家理解了V必须是字符串,但是编译器如何决定V
?V
是由编译器决定的。如果写入函数f=one.compose(two)
,则V
被推断为整数
,这不符合约束条件。如果不包括该类型,V
将被推断为String
@未知知道我怎么能看到泛型的推断代码?作为使用javap-c.@UnKnown的字节码,我认为编译后泛型会变成一堆类型转换,所有泛型参数都会变成Object
。我以前从未看过字节码,但我认为您可以看到一些强制转换。非常感谢大家理解V必须是字符串,但编译器如何确定V
?V
是由编译器确定的。如果写入函数f=one.compose(two)
,则V
被推断为整数
,这不符合约束条件。如果不包括该类型,V
将被推断为String
@未知知道我怎么能看到泛型的推断代码?作为使用javap-c.@UnKnown的字节码,我认为编译后泛型会变成一堆类型转换,所有泛型参数都会变成Object
。我以前从未看过字节码,但我认为
Function<A, B> one = ...
Function<C, SubclassOfB> two = ...
Function<SubclassOfC, B> f = one.compose(two);
Function<Integer, String> one = new Function<Integer, String>() {
@Override
public String apply(Integer i) {
return i.toString();
}
};
String resultApply = one.apply(5);