Java 为什么不能在方法名之后放置类型参数?

Java 为什么不能在方法名之后放置类型参数?,java,generics,Java,Generics,如果事实如此,问题是: 如果可以将类型参数放在方法名称之后,可能会出现什么问题? 例如: import com.google.common.base.Predicate; 静态导入com.google.common.base.Predicates.alwaysTrue; 谓词p=alwaysTrue(); 更新: 我知道可以通过以下方式传递类型参数: Predicate<SomeType> p = Predicates.<SomeType>alwaysTrue();

如果事实如此,问题是:

如果可以将类型参数放在方法名称之后,可能会出现什么问题?


例如:

import com.google.common.base.Predicate;
静态导入com.google.common.base.Predicates.alwaysTrue;
谓词p=alwaysTrue();

更新:

我知道可以通过以下方式传递类型参数:

Predicate<SomeType> p = Predicates.<SomeType>alwaysTrue();
Predicate p=Predicates.alwaysTrue();

如果问题是Java设计人员为什么要这样设计语法:我最好的猜测是,这是因为方法名称有自己的名称空间,与变量/字段名称分开,这意味着方法名称与变量或字段名称相同是合法的,上下文决定使用哪个名称。因此:

x = myName;
查找名为
myName
的变量或字段,而

x = myName(arg);
查找名为
myName
的方法。左边的
告诉编译器寻找方法而不是变量。这样,即使
myName
作为变量和方法都具有法律意义,编译器也可以接受这两条语句

如果语法为,则类型参数位于方法名称之后:

x = myName<T>(arg);

请记住,解释
>
的规则是特殊的——它在类型上下文中被视为两个独立的
字符(这样您就可以拥有
ArrayList
),但作为移位运算符。我不想成为编写编译器代码或语言规则以确保两者都正确处理的人。

我在这里看到两个不同的问题:

为什么需要一个类或对象来参数化一个方法

public class Test {
    private static <T> void staticMethod() {}
    private <T> void method() {}
    public Test() {
        method();                // Works!
        <Integer>method();       // Doesn't work!
        this.<Integer>method();  // Works again!
    }

    public static void main(String[] args) {
        staticMethod();                // Works!
        <Integer>staticMethod();      // Doesn't work
        Test.<Integer>staticMethod(); // Works again!
    }
}
公共类测试{
私有静态void staticMethod(){}
私有void方法(){}
公开考试(){
方法();//有效!
方法();//不起作用!
此.method();//再次工作!
}
公共静态void main(字符串[]args){
staticMethod();//有效!
staticMethod();//不起作用
Test.staticMethod();//再次工作!
}
}
不幸的是,我无法给出答案

第二个问题:为什么方法类型参数放在方法之前(而类参数放在类之后)

这里我有一个预感-其中一个问题是泛型构造函数。泛型构造函数可以像任何其他方法一样具有类型参数,并且这些参数可以独立于类类型参数:

public class Class<T> {
    public <V>Class(V arg) {

    }
    public static void main(String[] args) {
        new <Number>Class<Object>(0);
    }
}
公共类{
公共类(V arg){
}
公共静态void main(字符串[]args){
新类别(0);
}
}
这是有效的语法,第一个类型参数是方法参数,而第二个是类类型参数

需要有一种机制来区分这些,记住——由于向后兼容性,开发人员可以一时兴起而忽略这两种方法

除了将它们放在构造函数调用的不同侧面之外,我想不出任何其他方法来实现这一点


我想在没有对象或类的情况下调用参数化方法也会出现类似的模糊情况,但我现在想不出任何问题。

当前的方法参数化方法有什么问题?@Ordous静态导入的方法不可能参数化……这只是语言的构建方式,或多或少ss@erradir
Predicate.alwaysTrue()
将起作用。至于为什么这是可以接受的,而您提出的语法不是——您可能想编辑您的问题,因为回答者似乎认为您不知道如何键入方法,并询问如何键入方法。该问题隐含地问:在Java的某个版本中,是否有其他方法可以传递type参数到方法,或者这是完全不可能的?目前这是最好的答案,但我等待问题的例子,从数学上严格解释它的重要性。你可能要等很长时间。语言设计师不需要“证明”如果有什么东西会使语言规则变得很难理解,给编译器编写人员带来太大的负担,或者导致代码可能会让读者感到困惑,那么这些都是不允许这样做的充分理由。
public class Test {
    private static <T> void staticMethod() {}
    private <T> void method() {}
    public Test() {
        method();                // Works!
        <Integer>method();       // Doesn't work!
        this.<Integer>method();  // Works again!
    }

    public static void main(String[] args) {
        staticMethod();                // Works!
        <Integer>staticMethod();      // Doesn't work
        Test.<Integer>staticMethod(); // Works again!
    }
}
public class Class<T> {
    public <V>Class(V arg) {

    }
    public static void main(String[] args) {
        new <Number>Class<Object>(0);
    }
}