我对Java不是很坚强。有人可以解释我在antlr代码库中找到的这一行代码吗?是否是一个名为accept
的函数,该函数返回一个类型为T
且参数类型为ParseTreeVisitor
且扩展了T
且称为var1
的类型<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);
}
开头只是整个方法签名的类型参数?
dataType
答案 0 :(得分:3)
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
的类型参数将是返回类型的子类型(或与返回类型相同),但未指定这些类型是什么。