【问题标题】:Syntax for specifying a method reference to a generic method用于指定对泛型方法的方法引用的语法
【发布时间】:2015-07-06 11:50:59
【问题描述】:

我在“Java - 初学者指南”中阅读了以下代码

interface SomeTest <T>
{
    boolean test(T n, T m);
}

class MyClass
{
    static <T> boolean myGenMeth(T x, T y)
    {
        boolean result = false;
        // ...
        return result;
    }
}

以下说法有效

SomeTest <Integer> mRef = MyClass :: <Integer> myGenMeth;

上面代码的解释有两点

1 - 当泛型方法被指定为方法引用时,其类型参数位于 :: 之后和方法名称之前。

2 - 在指定泛型类的情况下,类型参数在类名之后并在:: 之前。

我的查询:-

上面的代码是第一个引用点的例子

谁能提供一个实现第二个引用点的代码示例?

(基本上我不明白第二个引用点)。

【问题讨论】:

  • 这段代码无法编译。
  • @ChetanKinger :此代码不会按原样编译。首先,您必须在其中添加一个主类,然后将 SomeTest &lt;Integer&gt; mRef = MyClass :: &lt;Integer&gt; myGenMeth; 放入该主类中
  • 请发布MVC 代码示例。据我所知,即使我们按照您在上一条评论中所说的操作,它也不会编译。
  • @kevingomes,不幸的是,Keppil 接受的答案在您的实际问题中可能仍然不正确。虽然这是一种形式的方法参考,但它可能不是书中引用的意思。
  • @AndyBrown :那么请发布正确答案。

标签: java generics method-reference


【解决方案1】:

第二个引用点只是表示类型参数属于类。例如:

class MyClass<T>
{
    public boolean myGenMeth(T x, T y)
    {
        boolean result = false;
        // ...
        return result;
    }
}

然后会这样调用:

SomeTest<Integer> mRef = new MyClass<Integer>() :: myGenMeth;

【讨论】:

  • 为什么我不能在boolean myGenMeth(T x, T y);之前添加static
  • static 会将方法转换为类方法,而不是实例方法。由于此处必须创建类的实例来设置类型参数,因此不能声明使用泛型类类型参数的static 方法。
  • 老兄,您的代码不起作用;我用SomeTest &lt;Integer&gt; mRef = MyClass &lt;Integer&gt; :: genMeth;
  • @kevingomes 这行不通,因为你没有OtherClass。 Keppil 急于给你举个例子。将其更改为Integer :)
  • @ChetanKinger :我正在使用Integer,但它仍然无法正常工作
【解决方案2】:

例如

  Predicate<List<String>> p = List<String>::isEmpty;

其实我们这里不需要类型参数;类型推断会处理

  Predicate<List<String>> p = List::isEmpty;

但在某些情况下类型推断失败,例如当将此方法引用传递给没有足够推理约束的泛型方法时,可能需要指定类型参数。

【讨论】:

  • 你能告诉我你的回答和 Keppil 的回答有什么区别吗
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多