在省略类名的同时在本地调用泛型静态方法

时间:2015-09-04 11:26:44

标签: java generics

这是我要调用/调用的方法。

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 会产生编译时错误?

3 个答案:

答案 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规则,但这种混淆太危险了。

-

(通用方法类型参数歧义)