天道酬勤,学无止境

为什么 $(Write-Host) 的子表达式输出到字符串的开头?(Why does a subexpression of $(Write-Host) output to beginning of string?)

问题

在 $() 子表达式中使用 Write-Host 始终输出到字符串的开头,无论其位置如何。

例如:

"This is $(Write-Host 'now at the beginning' -NoNewline)"

输出:

now at the beginningThis is

其他 cmdlet 在这里按预期工作(例如"Today is $((Get-Date).DayOfWeek)" , Today is Friday )。

写主机有何不同?

回答1

它不会“输出到字符串的开头”,而是以“向后”的顺序向主机写入两次。

  1. "abc $()"是一个包含子表达式的字符串文字。
  2. 计算字符串是什么,意味着评估$()
  3. 评估$() now at the beginning写入屏幕并且不返回任何内容
  4. 现在字符串文字是"abc"
  5. 现在"abc" now at the beginningabc写入屏幕"abc"

这不是按照你的建议做的:

  1. "abc $(write-host 'hi')"
  2. "hiabc"
  3. 写入屏幕。
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 涉及变量引用和子表达式的参数模式中未加引号的标记:为什么它们有时会拆分为多个参数?(Unquoted tokens in argument mode involving variable references and subexpressions: why are they sometimes split into multiple arguments?)
    问题 注意:此问题的摘要已发布在 PowerShell GitHub 存储库中,此后已被此更全面的问题取代。 在 PowerShell 中传递给命令的参数在参数模式下解析(与表达式模式相反 - 请参阅获取帮助 about_Parsing)。 方便的是,不包含空格或元字符的(双)引用参数通常是可选的,即使这些参数涉及变量引用(例如$HOME\sub )或子表达式(例如version=$($PsVersionTable.PsVersion) 。 在大多数情况下,这种不带引号的参数被视为双引号字符串,并且通常的字符串插值规则适用(除了元字符,如,需要转义)。 我试图在这个答案中总结参数模式中未引用标记的解析规则,但有一些奇怪的边缘情况: 具体来说(从 Windows PowerShell v5.1 开始),为什么以下每个命令中未加引号的参数标记不被识别为单个可扩展字符串,并导致传递2 个参数(变量引用/子表达式保留其类型) ? $(...)在令牌的开头: Write-Output $(Get-Date)/today # -> 2 arguments: [datetime] obj. and string '/today' 请注意,以下工作按预期进行: Write-Output $HOME/sub - 简单变量。 开头的参考 Write-Output today/$(Get-Date) -
  • 解析包含逗号和换行符的逗号分隔值(Parsing comma-separated values containing quoted commas and newlines)
    问题 我有一些特殊字符的字符串。 目的是检索每行的String [](,分隔)。您可以使用特殊字符“,在其中可以使用/ n和, For example Main String Alpha,Beta,Gama,"23-5-2013,TOM",TOTO,"Julie, KameL Titi",God," timmy, tomy,tony, tini". 您可以看到“ /”中有您/ n。 任何可以帮助我解析此。 谢谢 __更多说明 与主刺我需要分开这些 Here Alpha Beta Gama 23-5-2013,TOM TOTO Julie,KameL,Titi God timmy, tomy,tony,tini 问题是:对于Julie,KameL,Titi,存在换行符/ n或在KameL和Titi之间,对于timmy,tomy,tony,tini类似问题,存在换行符/ n或在托尼和蒂尼之间。 此文本位于文件中(必须逐行阅读) Alpha,Beta Charli,Delta,Delta Echo ,Frank George,Henry 1234-5,"Ida, John ", 25/11/1964, 15/12/1964,"40,000,000.00",0.0975,2,"King, Lincoln ",Mary / New York,123456 12543-01,"Ocean
  • 列出子节点元包含某个值的所有节点 123456(List all nodes which sub-node meta contains some value 123456)
    问题 我希望下面的脚本输出Pdt 1和Pdt3如果它们的子节点元包含123456 ,但它不输出任何内容。 什么是正确的语法? 我知道问题来自错误的标准语法@id='$_.id' ForEach-Object { $meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$_.id']/metas/meta[@code='$meta_code']") } 这是整个脚本的一部分: $xml=[xml]@' <?xml version="1.0" encoding="iso-8859-1"?> <catalogue> <produits> <produit id="pdt1" libelle="produit 1" cat="PDT"> <metas date="2015.07.24"> <meta code="123456" value="123456"></meta> <meta code="789012" value="ghijkl"></meta> <meta code="345678" value="mnopqr"></meta> </metas> </produit> <produit id="pdt2" libelle="produit 2" cat="PDT"> <metas date="2015
  • 为什么String.match(/ \ d * /)返回一个空字符串?(Why does String.match( / \d*/ ) return an empty string?)
    问题 有人可以帮助我理解为什么使用\ d *返回包含空字符串的数组,而使用\ d +返回[“ 100”](按预期)的原因。 我知道为什么\ d +有效,但是看不到为什么\ d *完全无效。 使用*会导致它返回零长度的匹配,这是如何工作的? var str = 'one to 100'; var regex = /\d*/; console.log(str.match(regex)); // [""] 回答1 请记住, match正在寻找它可以找到与给定正则表达式匹配的第一个子字符串。 *表示某物可能有零个或多个,因此\d*表示您正在寻找包含零个或多个数字的字符串。 如果您输入的字符串以数字开头,则整个数字都将匹配。 "5 to 100".match(/\d*/); // "5" "5 to 100".match(/\d+/); // "5" 但是由于第一个字符是非数字字符,所以match()认为字符串的开头(无字符)与正则表达式匹配。 由于您的字符串不以任何数字开头,因此空字符串是您输入的第一个与该正则表达式匹配的子字符串。 回答2 /\d*/ 表示“匹配从字符串开头开始的0个或多个数字”。 当您开始输入字符串的开头时,它会立即命中一个非数字,并且不能再走了。 但这被认为是成功的匹配,因为“ 0或更多”。 您可以通过以下方式尝试“ 1个或更多” /\d+/
  • 为什么“ abcd” .StartsWith(“”)返回true?(Why does “abcd”.StartsWith(“”) return true?)
    问题 标题是整个问题。 有人可以告诉我为什么会发生这种情况吗? 回答1 是的-因为它确实以空字符串开头。 实际上,空字符串在逻辑上在每对字符之间出现。 这样说:您能给“开始于”的什么定义排除这种情况吗? 这是一个简单的“开始于”的定义,它没有: “如果x的前y.Length字符与y的y.Length匹配,则x以y开头。” 替代(等效)定义: “如果x.Substring(0, y.Length).Equals(y)则x以y x.Substring(0, y.Length).Equals(y) ” 回答2 我将尽力阐述乔恩·斯基特所说的话。 假设x,y和z是字符串,而+运算符实际上是串联的,那么: 如果我们可以将z拆分为z = x + y,则意味着z以x开头。 因为每个字符串z都可以拆分为z =“” + z,所以每个字符串都以“”开头。 因此,因为(“” +“ abcd”)==“ abcd”,所以“ abcd”以“”开头 回答3 我将从一个易于理解的相关事实开始。 空集是每个集的子集。 为什么? 子集状态的定义, A的一个子集B如果中的每个元素A是的元件B 。 相反, A不是的一个子集B如果存在的元件A不是的元素B 。 现在修复集合B 我将确定空集是B的子集。 我将通过显示空集不是B的子集的情况来做到这一点。 如果空集是没有的一个子集B然后我能找到的空集不在的元素B 。
  • 为什么处理父元素的模板会阻止处理子元素模板?(Why does processing a parent element's template prevent the processing of child element templates?)
    问题 考虑这个 XML: <person> <name> <firstName>James</firstName> <lastName>Bond</lastName> </name> </person> 然后考虑这个 XSL: <xsl:template match="//name"> [do stuff] </xsl:template> <xsl:template match="//firstName"> [do stuff] </xsl:template> 我说第一个模板(“//name”)的存在“隐藏”了第二个模板(“//firstName”)是否正确。 我知道这是真的(我在发布之前测试过),但我试图推导出和理解一般规则。 自从... 它(“//name”)不太具体它将首先匹配它不调用“应用模板” ...不会处理第二个模板。 这种逻辑的机制是什么,如何预测? 当处理“//name”模板时,处理器是否以某种方式在逻辑上“检查”所有不需要处理的子元素? 他们是否认为“完成”是因为他们的父母被处理了? 如果我想确保运行第二个模板,除了确保在第一个模板中调用“apply-templates”之外,还有其他方法吗? 同样,我知道有办法解决这个问题,我只是想了解它背后的理论/理由。 回答1 michael.hor257k 和 Ian Roberts 提供的答案是正确和完整的
  • shell字符串匹配的实现
    一、简介 Bash Shell提供了很多字符串和文件处理的命令。如awk、expr、grep、sed等命令,还有文件的排序、合并和分割等一系列的操作命令。grep、sed和awk内容比较多故单独列出,本文只涉及字符串的处理和部分文本处理命令。 二、字符串处理 1、expr命令 expr引出通用求值表达式,可以实现算术操作、比较操作、字符串操作和逻辑操作等功能。 (1)计算字符串长度 字符串名为string,可以使用命令${#string}或expr length $string两种方法来计算字符串的长度。若string包括空格,需用双引号引起来(expr length后面只能跟一个参数,string有空格会当作多个参数处理)。 (2)子串匹配索引 expr的索引命令格式为:expr index $string $substring(子串),在字符串$string上匹配$substring中字符第一次出现的位置,匹配不到,expr index返回0。 "wo"在字符串string中虽然出现在第7,但还是返回o首次出现的位置5。 (3)子串匹配的长度 expr match $string $substring,在string的开头匹配substring字符串,返回匹配到的substring字符串的长度,若string开头匹配不到则返回0
  • 如何在PowerShell中连接字符串和变量?(How do I concatenate strings and variables in PowerShell?)
    问题 假设我有以下代码段: $assoc = New-Object PSObject -Property @{ Id = 42 Name = "Slim Shady" Owner = "Eminem" } Write-Host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner 我希望这个代码片段显示出来: 42 - Slim Shady - Eminem 但是它显示: 42 + - + Slim Shady + - + Eminem 这使我认为+运算符不适用于连接字符串和变量。 您应该如何使用PowerShell处理此问题? 回答1 Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)" 请参阅Windows PowerShell语言规范版本3.0,p34,子表达式扩展。 回答2 单引号和双引号之间是有区别的。 (我正在使用PowerShell 4)。 您可以执行此操作(如本杰明所说): $name = 'Slim Shady' Write-Host 'My name is'$name -> My name is Slim Shady 或者,您可以执行以下操作: $name = 'Slim Shady' Write-Host "My name is
  • PowerShell:写入输出仅写入一个对象(PowerShell: write-output only writes one object)
    问题 我正在学习PowerShell,并且阅读的大量文章强烈反对使用写入主机来告诉我这是“错误的做法”,并且几乎总是可以用另一种方式显示输出。 因此,我接受了建议并尝试避免使用写入主机。 我发现的一个建议是改用写输出。 据我了解,这会将所有内容放入管道中,并且输出在脚本(?)的末尾执行。 但是,我在输出所需内容时遇到了问题。 此示例演示了该问题: $properties = @{'OSBuild'="910ef01.2.8779"; 'OSVersion'="CustomOS 3"; 'BIOSSerial'="A5FT-XT2H-5A4B-X9NM"} $object = New-Object –TypeName PSObject –Prop $properties Write-output $object $properties = @{'Site'="SQL site"; 'Server'="SQL Server"; 'Database'="SQL Database"} $object = New-Object –TypeName PSObject –Prop $properties Write-Output $object 这样,我可以很好地输出显示OS数据的第一个对象,但是永远不会显示包含SQL数据的第二个对象。 我试过重命名变量名和其他很多东西,但是没有运气。
  • 为什么 PowerShell 会在 stderr 上截断消息?(Why does PowerShell chops message on stderr?)
    问题 我正在使用 PowerShell 脚本来控制编译器 (ghdl.exe) 的不同编译步骤。 编译器有 3 种不同的输出格式: 没有输出也没有错误 => $LastExitCode = 0 stderr 上的输出(警告),但没有错误 => $LastExitCode = 0 stderr 上的输出(错误),可能还有警告 => $LastExitCode != 0 因为处理 stderr 和 stdout 接缝非常有问题,所以我使用了这篇 StackOverflow 帖子中介绍的方法:PowerShell:使用 Invoke-Expression 管理错误 这是我使用附加消息着色的实现: function Format-NativeCommandStreams { param([Parameter(ValueFromPipeline=$true)]$InputObject) begin { $ErrorRecordFound = $false } process { if (-not $InputObject) { Write-Host "Empty" } elseif ($InputObject -is [System.Management.Automation.ErrorRecord]) { $ErrorRecordFound = $true $text =
  • 如何在PowerShell中输出内容(How to output something in PowerShell)
    问题 我正在从批处理文件中运行PowerShell脚本。 该脚本获取一个网页,并检查该网页的内容是否为字符串“ OK”。 PowerShell脚本将错误级别返回到批处理脚本。 批处理脚本由FTP自动化程序ScriptFTP执行。 如果发生错误,我可以让ScriptFTP通过电子邮件将完整的控制台输出发送给管理员。 在PowerShell脚本中,我想从网站输出返回值(如果它不是“ OK”),因此错误消息将包含在控制台输出中,并因此包含在状态邮件中。 我是PowerShell的新手,不确定要为此使用哪个输出函数。 我可以看到三个: 写主机写输出写错误 写入Windows等效于stdout什么? 回答1 仅输出某些东西就是PowerShell,这是一件很美的事情-它的最大优点就是。 例如,常见的Hello,World! 应用程序简化为一行: "Hello, World!" 它创建一个字符串对象,分配上述值,并且它是命令管道上的最后一项,它调用.toString()方法,并将结果输出到STDOUT (默认情况下)。 美丽的东西。 其他Write-*命令专用于将文本输出到其关联的流,并按其位置放置。 回答2 我认为在这种情况下,您将需要Write-Output。 如果您有类似的脚本 Write-Output "test1"; Write-Host "test2"; "test3"; 然后
  • 为什么这三个正则表达式的步数不同?(Why do these three regexes have different step counts?)
    问题 在对最近一个问题的回答中,我设计了几个聪明的小正则表达式(应提问者的要求)来匹配字符串开头或结尾的子字符串。 然而,当在 Regex101 上运行时,我注意到不同的模式有不同的步数(表明正则表达式引擎必须为一个和另一个做更多的工作)。 然而,在我看来,没有直观的理由认为应该如此。 三种模式如下: 有趣的条件: /(^)?!next(?(1)|$)/ (演示 - 86 个步骤) 经典交替: ^!next|!next$ (演示 - 58 个步骤) 讨厌的回顾: !next(?:(?<=^.{5})|(?=$)) (演示 - 35 个步骤) 为什么第一种模式的效率比第二种模式低得多,而且最令人困惑的是,为什么第三种模式效率如此之高? 回答1 TL; 博士 为什么第一种模式的效率比第二种模式低得多,而且最令人困惑的是,为什么第三种模式效率如此之高? 因为前两个是锚定的,第三个不是。 真实故事,如何采取步骤 考虑到这个正则表达式/^x/gm ,如果主题字符串是abc您认为引擎将采取多少步骤来返回“不匹配”? 你是对的,两个。 断言字符串的开头匹配x 然后整体匹配失败,因为在字符串断言开始之后没有立即出现x 。 好吧,我撒谎了。 并不是说我讨厌,只是让人们更容易理解将要发生的事情。 根据 regex101.com 它根本不需要任何步骤: 这次你信吗? 是的。 不,让我们看看。
  • 如何在命令行上传递一系列值-将表达式作为参数传递(how do I pass a range of values on the command line - passing an expression as an argument)
    问题 我有以下代码: $srv_range = 29..30+40+50..52 $srv_range.GetType() $NewVMTemplate = New-Object psobject $NewVMTemplate | Add-Member -MemberType NoteProperty -Name Name -Value $null $srv_range | % { $pod= $_ $servers = @() 1..2 | % { $server = $NewVMTemplate | Select-Object * $server.Name = "pod" + "{0:D2}" -f $pod + "-srv" + $_ $servers += $server } ForEach ( $server in $servers) { write-host $server.Name } } 输出: PowerCLI C:\ .\eraseme.ps1 IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array pod29-srv1 pod29-srv2 pod30-srv1 pod30-srv2 pod40-srv1 pod40-srv2
  • 相对于其两端对数组进行切片的惯用方法是什么?(What is the idiomatic way to slice an array relative to both of its ends?)
    问题 Powershell 的数组表示法具有相当奇怪的(尽管有记录)切片数组末尾的行为。 官方文档中的这一部分很好地总结了奇怪之处: 负数从数组的末尾开始计数。 例如,“-1”指的是数组的最后一个元素。 要显示数组的最后三个元素,请键入: $a[-3..-1] 但是,使用此符号时要小心。 $a[0..-2] 此命令不引用数组的所有元素,除了最后一个。 它指的是数组中的第一个、最后一个和倒数第二个元素。 以下代码证实了这种奇怪之处: $a = 0,1,2,3 $a[1..-1] 这确实输出了这个奇怪的结果: 1 0 3 所以,问题是,什么是惯用的方式切片与一个指数相对开始和另一个亲戚数组的结束? 请告诉我这比这个丑陋的混乱更好: $a[1..($a.Count-1)] 编辑: 描述我正在寻找的另一种方法是:这个python表达式的惯用Powershell等价物: a=1,2,3,4 a[1:-1] 当然,它的计算结果为(2,3) 回答1 如果你想从数组的末尾获取n 个元素,只需从-n到-1获取元素: PS C:\> $a = 0,1,2,3 PS C:\> $n = 2 PS C:\> $a[-$n..-1] 2 3 编辑:由于$a[$i..$j]工作方式,PowerShell 不支持相对于数组开头和结尾的索引。 在 Python 表达式a[i:j
  • Java Regex中match()和find()之间的区别(Difference between matches() and find() in Java Regex)
    问题 我试图了解match()和find()之间的区别。 根据Javadoc,(据我了解),即使matches()找到了所要查找的内容,它也会搜索整个字符串,而find()在找到要查找的内容时将停止。 如果这个假设是正确的,除非您要计算它找到的匹配项的数量,否则我什么时候都看不到要使用matches()而不是find() 。 我认为String类应该具有find()而不是matches()作为内置方法。 所以总结一下: 我的假设正确吗? 什么时候使用matches()而不是find()有用? 回答1 matches尝试将表达式与整个字符串进行匹配,并在模式的开头隐式添加^ ,在模式末尾隐含$ ,这意味着它不会查找子字符串。 因此,此代码的输出: public static void main(String[] args) throws ParseException { Pattern p = Pattern.compile("\\d\\d\\d"); Matcher m = p.matcher("a123b"); System.out.println(m.find()); System.out.println(m.matches()); p = Pattern.compile("^\\d\\d\\d$"); m = p.matcher("123"); System.out
  • Batch:为什么附加文本文件会写“ECHO is off”?(Batch: Why does appending a textfile write “ECHO is off” instead?)
    问题 所以我写了一个批处理,其中有一些代码来检查它通过读取文本文件运行了多少次,然后将新的增加的数字写回到该文本文件中。 @ECHO OFF for /f "delims=" %%x in (TimesRun.txt) do set Build=%%x set Build=%Build%+1 @echo Build value : %Build% echo %Build%>>TimesRun.txt Pause 这确实附加了文本文件,但它添加了“1+1”。 傻我! 我忘了使用 /a 开关来启用算术运算! 但是当我相应地更改代码时...... @ECHO OFF for /f "delims=" %%x in (TimesRun.txt) do set Build=%%x set /a Build=%Build%+1 @echo Build value : %Build% echo %Build%>>TimesRun.txt Pause ......发生了一些有趣的事情: ECHO 关闭,而不是附加我的文件。 写在控制台上。 现在,我知道这通常发生在ECHO在没有文本或空变量的情况下使用时。 我添加了第一个@echo Build value : %Build%专门查看变量Build是否为空; 事实并非如此,并且计算是正确执行的。 我已经想通了 >>TimesRun.txt (echo
  • 为什么我的正则表达式在 RegexPlanet 和 regex101 上有效,但在我的代码中无效?(Why does my regex work on RegexPlanet and regex101 but not in my code?)
    问题 给定字符串#100=SAMPLE('Test','Test',我想提取100和Test 。我创建了正则表达式^#(\d+)=SAMPLE\('([\w-]+)'.*为此目的。 我在 RegexPlanet 和 regex101 上测试了正则表达式。 这两种工具都给了我预期的结果,但是当我尝试在我的代码中使用它时,我没有得到匹配。 我使用以下代码段来测试正则表达式: final String line = "#100=SAMPLE('Test','Test',"; final Pattern pattern = Pattern.compile("^#(\\d+)=SAMPLE\\('([\\w-]+)'.*"); final Matcher matcher = pattern.matcher(line); System.out.println(matcher.matches()); System.out.println(matcher.find()); System.out.println(matcher.group(1)); System.out.println(matcher.group(2)); 输出是 true false Exception in thread "main" java.lang.IllegalStateException: No match found
  • 为什么javascript字符串匹配包含未定义(Why javascript string match includes undefined)
    问题 我有一个或多或少像这样的正则表达式: '(801) 555-1234'.match(/^(1[-. ]?)?\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/) 由于某种原因,此返回 ["(801) 555-1234", undefined] 如果我将全局标志添加到正则表达式(例如...{4}$/g ),则未定义的值会丢失,并且我得到 ["(801) 555-1234"] 如果不需要,我宁愿不要使用g标志(在我看来这不是必需的,因为正则表达式以^开头,以$结尾)。 PS出于匹配电话号码的目的而忽略了正则表达式的质量。 这可能不是理想的方法,但这是我正在维护的代码。 通常,我对^ ... $以及标志的存在/不存在以及未定义的值感兴趣。 为什么显示undefined ,并且为什么标志会有所不同? 回答1 这是一个小组: /^(1[-. ]?)? .match (不带/g标志)和.exec返回组作为数组的一部分。 如果组不匹配,则其值将设置为undefined 。 获取第一个元素: '(801) 555-1234'.match(/^(1[-. ]?)?\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/)[0] 如果由于某些原因真的想要单元素数组,则可以使其不捕获: /^(?:1[-. ]?)? 但是,到那时
  • PowerShell中的函数返回值(Function return value in PowerShell)
    问题 我已经开发了一个PowerShell函数,该函数执行许多有关配置SharePoint Team网站的操作。 最终,我希望函数以String的形式返回预配置站点的URL,因此在函数末尾,我将具有以下代码: $rs = $url.ToString(); return $rs; 调用此函数的代码如下: $returnURL = MyFunction -param 1 ... 所以我期待一个String,但是不是。 而是,它是类型System.Management.Automation.PSMethod的对象。 为什么返回该类型而不是String类型? 回答1 PowerShell具有真正古怪的返回语义-至少从更传统的编程角度来看时是如此。 有两个主要想法可以帮助您解决问题: 捕获所有输出,并返回 return关键字实际上只是指示逻辑出口点 因此,以下两个脚本块将有效地执行完全相同的操作: $a = "Hello, World" return $a $a = "Hello, World" $a return 第二个示例中的$ a变量保留为管道上的输出,并且如上所述,返回了所有输出。 实际上,在第二个示例中,您可以完全省略返回值,并且您将获得相同的行为(当函数自然完成并退出时,就暗示了返回值)。 没有更多的函数定义,我无法说出为什么要得到PSMethod对象。 我的猜测是
  • 为什么Java 8泛型类型推断会选择此重载?(Why does the Java 8 generic type inference pick this overload?)
    问题 考虑以下程序: public class GenericTypeInference { public static void main(String[] args) { print(new SillyGenericWrapper().get()); } private static void print(Object object) { System.out.println("Object"); } private static void print(String string) { System.out.println("String"); } public static class SillyGenericWrapper { public <T> T get() { return null; } } } 它在Java 8下打印“ String”,在Java 7下打印“ Object”。 我希望这在Java 8中是模棱两可的,因为两个重载方法都匹配。 为什么在JEP 101之后编译器会选择print(String) ? 是否合理,这破坏了向后兼容性,并且在编译时无法检测到更改。 升级到Java 8后,该代码的行为便有所不同。 注意: SillyGenericWrapper被命名为“傻”是有原因的。 我试图理解为什么编译器会以这种方式运行