小编azt*_*rex的帖子

当实例作为其超接口传递时,Java 8默认实现不可用

AbstractMethodError在调用一个方法时会收到一个,我认为该方法应该在目标实例中有一个默认实现.

我在三个参数中创建了一个功能接口,但也派生自java.util.function.Function并提供了一个默认实现Function#apply(..).然后我使用3参数lambda表达式创建我的接口实例.3参数方法都Function#apply(..)可以在创建的实例中正常工作.

当我将创建的实例传递给期望我的接口的方法时,我可以Function#apply(..)从方法中调用它并且它工作正常.

但是当我将实例传递给期望a的方法时Function,我会在AbstractMethodError尝试调用时收到Function#apply(..).

我似乎错过了对默认方法如何以及何时绑定到实例的理解.我做错了什么?

展示:

package spike;

import java.util.function.BiFunction;
import java.util.function.Function;

public class ReductionProblem {

    interface F3<T, U, V, R> extends Function<T, BiFunction<U, V, R>> {

        default BiFunction<U, V, R> apply(final T t) {
            return (U u, V v) -> apply(t, u, v);
        }

        R apply(T t, U u, V v);

    }

    private static <T, U, V, R> BiFunction<U, V, R> workingReduce(
            F3<T, …
Run Code Online (Sandbox Code Playgroud)

java java-8

9
推荐指数
1
解决办法
304
查看次数

泽西岛不遵守@Produces的响应媒体类型规则

当一个方法可以生成几个中的一个时,我可能会误解Jersey规范中的响应的媒体类型.根据https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e1785,我认为当@Produces(..)注释中列出的两种媒体类型与传入Accept标头匹配时,Jersey将遵守与这些类型相关的任何权重.如果权重没有决定胜利者,注释或将选择第一个.

下面的代码演示了这不是实践中的行为.在最后两种情况下,我希望在请求不明确的时候进行JSON响应,但我会得到XML.我对文档的理解不正确吗?或者这可能是泽西岛的缺陷?

我尝试过的事情:

  1. @XmlRootElement从模型中删除注释.最后两个案件然后通过,但第二个案件分歧,因为没有合适的作家.
  2. Object从资源方法返回.结果是案例的通过/未通过状态没有变化.
  3. @Produces(..)资源类的注释中删除权重(JSON媒体类型仍然首先列出).结果是案例的通过/未通过状态没有变化.

这个例子是在Ubuntu 14.04上使用Jersey 2.10和Java 1.8_05构建的.

package demo;

import java.net.URI;
import java.util.Arrays;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.annotation.XmlRootElement;

import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

import com.sun.net.httpserver.HttpServer;

public class DemonstrateAmbiguousMediaType {

    private static final String BASE_URI = "http://localhost:8092/";

    public static void main(final String[] args) {

        final HttpServer server = startServer();

        try {

            /*
             * These cases work …
Run Code Online (Sandbox Code Playgroud)

java jax-rs jersey-2.0

5
推荐指数
1
解决办法
679
查看次数

标签 统计

java ×2

java-8 ×1

jax-rs ×1

jersey-2.0 ×1