这是我要调用/调用的方法。
MyClass
这是我测试调用前一个方法的方法(两者都位于名为 public static void testInvokeGenericMethodLocally() {
doGenericStatic2(100, "Text");
// <Integer,String>doGenericStatic2(100, "Text"); //Syntax error, insert "super ( ) ;" to complete Statement
MyClass.doGenericStatic2(100, "Text");
MyClass.<Integer,String>doGenericStatic2(100, "Text");
}
的同一个类中)
<Integer,String>doGenericStatic2(100, "Text");
为什么这种特殊情况(第二次调用测试)SELECT
DISTINCT (DATE(time_of_call)) AS unique_date,
COUNT(*) AS amount
FROM manual_calls
GROUP BY unique_date
ORDER BY unique_date ASC here
会产生编译时错误?
答案 0 :(得分:4)
这在JLS 15.12中有描述,它描述了方法调用语法:
[TypeArguments]
请注意,<
选项仅在方法出现在“点缀的东西”(我的技术名称)之后才可用。尽管托马斯的评论,JLS没有具体说明为什么<?php
$servername = "localhost";
$username = "root";
$password = "123";
$dbname = "websiteusers";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$query = "INSERT INTO websiteusers (fullname, lastname, userName, password, email)
VALUES (?, ?, ?, ?, ?)";
// prepare and bind
$stmt = $conn->prepare($query);
$stmt->bind_param("sssss", $fullname, $lastname, $username, $password, $email);
// set parameters and execute
$fullname ="Donald Duck";
$lastname = "Duck";
$username = "donalod";
$password = sha1("DonaldDuck1!");
$mail = "donald@duck.com"
$stmt->execute();
$fullname ="Mickey Mouse";
$lastname = "Mouse";
$username = "mickey";
$password = sha1("IloveDaisy");
$mail = "mickey@mouse.org"
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>
是TypeArguments开头还是小于,可能是正确的。
答案 1 :(得分:3)
正如yshavit已经发布的那样,JLS将<Integer,String>doGenericStatic2(100, "Text");
定义为非法语法(或者反过来说,它与法律语法的定义不匹配)。
这里没有说明这个的原因,但很可能它的目的是让编译器构建器/ JLS实现器的生命更容易,同时不会给开发人员增加太多(除了添加类名super
等的要求在声明前面。)
有人可能会说,有可能区分1 < 2
和<Integer, String>
,例如因为后面的语句以<
开头,后跟一个类型名称,而前者包含文字,方法调用或变量。
考虑以下有效代码段:
int Integer = 1;
int String = 2;
System.out.println( Arrays.asList( 1 <Integer, String> getMeSomeIntBiggerThan2() ) ); //prints [false, false]
虽然这是一个非常糟糕的设计,并且有点构建,JLS允许它和编译器必须处理它。您仍然应该能够区分泛型类型定义和操作,但为什么要使事情变得更复杂,以便允许不需要的语法?
答案 2 :(得分:1)
考虑这个例子
Update
可以解释为
x<<A>m()
或
x<<A > m()
如果我们允许语法 x < <A>m()
。虽然编译器可以选择一个胜利者,但很可能是第一个因为lexing规则,但这种混淆太危险了。
-
(通用方法类型参数歧义)