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

问题描述 投票:0回答:1

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

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参数,但是我正在探索其他选项。

java generics
1个回答
0
投票

没有一种方法可以强制执行。这是方法调用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](类型见证人)适用,它始终是可选的;没有办法强制它存在。

© www.soinside.com 2019 - 2024. All rights reserved.