调用泛型/参数化方法时,是否有一种方法可以强制提供类型实参?

时间:2020-03-09 14:48:12

标签: java generics

假设我有一个这样的类和方法:

public class Example {

    private final Map<String, Object> stuff = new HashMap<>();

    public <T> T getValue(String key) {
        return (T) stuff.get(key);
    }
}

是否可以强迫某人编写调用getValue()的代码来显式地为方法调用提供类型见证?

Example example = new Example();
Boolean resultWithParameter    = example.<Boolean>getValue("some_key");

我想做的就是在调用方法时总是需要参数。有没有办法做到这一点?我知道我总是可以添加一个Class参数,但是我正在探索其他选项。

1 个答案:

答案 0 :(得分:1)

没有一种方法可以强制执行。这是方法调用as defined by the JLS的结构。

MethodInvocation:
  MethodName ( [ArgumentList] )
  TypeName . [TypeArguments] Identifier ( [ArgumentList] )
  ExpressionName . [TypeArguments] Identifier ( [ArgumentList] )
  Primary . [TypeArguments] Identifier ( [ArgumentList] )
  super . [TypeArguments] Identifier ( [ArgumentList] )
  TypeName . super . [TypeArguments] Identifier ( [ArgumentList] )
ArgumentList:
  Expression {, Expression}

具体来说,您的示例涉及到此

Primary . [TypeArguments] Identifier ( [ArgumentList] )

example . <Boolean>       getValue   ( "some_key"     );

如果您不熟悉the notation,则最重要的部分是:

产品右侧的语法[x]表示零或 x的一次出现。也就是说,x是一个可选符号

因此,在[TypeArguments](类型见证人)适用的情况下,它始终是可选的;没有办法强制它存在。