This question already has answers here:
What does <T> (angle brackets) mean in Java?
                                
                                    (6个答案)
                                
                        
                        
                            What does <T> T mean when used as a method signature? Is it a return type?
                                
                                    (2个答案)
                                
                        
                2年前关闭。
            
        

我对Java不太强。有人可以解释我在antlr代码库中找到的这一行代码吗?它是一个名为accept的函数,该函数返回带有参数T的类型为ParseTreeVisitor的对象,该对象的类型参数扩展为称为Tvar1的类型参数,而开始的<T>部分仅仅是整个方法签名的类型参数?

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.antlr.v4.runtime.tree;

import org.antlr.v4.runtime.Parser;

public interface ParseTree extends SyntaxTree {
    ParseTree getParent();

    ParseTree getChild(int var1);

    <T> T accept(ParseTreeVisitor<? extends T> var1); << I don't get this line

    String getText();

    String toStringTree(Parser var1);
}

最佳答案

T被称为通用类型。像这样使用时,它表示“我不知道这里要使用哪种类型,但是我想知道在所有使用它的地方都一样”。

您可以改为在任何地方使用Object,这将允许使用任何类型,因为Java中的每种类型都是Object的子类型:

Object accept(ParseTreeVisitor<Object> var1);


但是,编译器将无法保证参数(var1)与返回类型之间的任何关联。

然后回到您的示例:

<T> T accept(ParseTreeVisitor<? extends T> var1);
--- -                         - ---------
 1  2                         3     4



定义通用类型T,现在可以在此函数定义中的任何位置使用它。
将返回类型指定为完全T
?指定ParseTreeVisitor的类型参数可以是任何...
...这将其限制为扩展T的任何类型(包括T本身)。


本质上,此方法签名保证var1的类型参数将是返回类型的子类型(或与返回类型相同),但不指定这些类型是什么。

07-24 09:37
查看更多