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代码库中找到的这一行代码吗?它是一个名为
但是,编译器将无法保证参数(
然后回到您的示例:
定义通用类型
将返回类型指定为完全
此
...这将其限制为扩展
本质上,此方法签名保证
(6个答案)
What does <T> T mean when used as a method signature? Is it a return type?
(2个答案)
2年前关闭。
我对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);
}
最佳答案
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
的类型参数将是返回类型的子类型(或与返回类型相同),但不指定这些类型是什么。