Java 泛型在参数中是如何工作的?

Java 泛型在参数中是如何工作的?,java,generics,functional-programming,Java,Generics,Functional Programming,我对泛型是如何工作的有点困惑?我正在学习java中的function,在那里我刚刚测试了function接口,对compose方法(泛型如何在compose方法中工作)感到困惑 阅读java官方教程网站上的泛型,我意识到如果我们在方法返回或参数中有任何泛型类型,我们必须在方法签名中声明该类型,如下所述 这是我读到的方法 1)第一个问题T&R在哪里申报?在返回类型和参数中使用的。还是我的理解错了 然后我阅读了泛型教程中的更多内容,然后我试图理解泛型中super和extends的概念,然后我对com

我对泛型是如何工作的有点困惑?我正在学习java中的
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);