小编Roh*_*bhu的帖子

为什么泛型参数上的通配符需要显式转换?

我有一个功能:

<T> T get(Class<T> fetchType) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我做的事情如下:

String x = get(String.class);
Run Code Online (Sandbox Code Playgroud)

这一切都很好.

但是,在另一个功能:

<R> R otherFunction(R base) {
    return get(base.getClass());
}
Run Code Online (Sandbox Code Playgroud)

给我一个错误,因为base.getClass()回报? extends R.

reason: no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to R
inference variable T has incompatible bounds:
equality constraints: capture of ? extends Object upper bounds: Object, R
Run Code Online (Sandbox Code Playgroud)

现在从我的理解,函数get(Class<T> x)返回T,所以当调用时? extends R,可以说是CAP#1,但从get现在返回CAP#1,将其分配给类型 …

java

7
推荐指数
1
解决办法
145
查看次数

对于返回CompletionStage的请求,Spring Boot会对过滤器运行两次

我遇到了一个问题,当方法返回时,我的过滤器运行了两次CompletionStage.从RequestMapping(此处)的文档中,它是受支持的返回值.

CompletionStage(由CompletableFuture实现),应用程序使用它在自己选择的单独线程中生成返回值,作为返回Callable的替代方法.

由于项目非常复杂,并且有很多并发代码,因此我创建了一个新的简单的spring-boot项目.这是(唯一的)控制器:

@Controller
public class BaseController {
    @RequestMapping("/hello")
    @ResponseBody
    public CompletionStage<String> world() {
        return CompletableFuture.supplyAsync(() -> "Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个过滤器:

@WebFilter
@Component
public class GenericLoggingFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;

        System.out.println(httpServletRequest.getMethod() + " " +
                           httpServletRequest.getRequestURI());

        chain.doFilter(request, response);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时curl http://localhost:8080/hello,它会GET /hello在控制台上打印两次.当我更改控制器方法以返回String:

@RequestMapping("/hello")
@ResponseBody
public String world() {
    return …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc

7
推荐指数
1
解决办法
1110
查看次数

当Java中的集合超出容量时会发生什么?

我有一个服务,它在内存中对所有调用进行调度,因为我们不想丢失数据,同时我们需要这个服务因为任何外部依赖(例如DB)而失败.然后定期拾取这些分阶段的呼叫并在后台处理.

如果由于任何原因,如果有太多的电话而且我们的内存耗尽,我们需要警惕.

所以,简单地说,问题是:当资源不足导致列表添加失败时,我需要捕获或监视哪些异常通知我?它会导致VM本身出现OOM,还是有集合级限制?

如果没有收集级别限制,您会如何建议我监控服务的使用情况?目前,我们有堆使用和内存使用指标.那些够用吗?此外,JVM配置为在OOM错误时终止(这是因为VM管理器然后重新启动它在kill上管理的任何进程).

java jvm

6
推荐指数
1
解决办法
131
查看次数

Kotlin难以向上推测到推断(现场)参数

我不确定'难以'是否是正确的词,但这是我面临的问题.我需要花费相当长的时间才能将其重现为最小的示例,所以这里有:

class BaseParameterizedType<T>

fun <U: BaseParameterizedType<*>> getSpecific(clazz: KClass<in U>) : U {
     TODO()
}

fun example(arg: KClass<out BaseParameterizedType<*>>)) {
    getSpecific(arg.innerType)
}
Run Code Online (Sandbox Code Playgroud)

好的,所以上面的代码在'TODO'失败了,但是如果它不在那里并且函数正常返回,那么它肯定会因空指针异常而失败.我努力弄清楚出了什么问题,所以我转向反编译的Java代码(来自kotlin字节码):

public static final void example(@NotNull KClass arg) {
  Intrinsics.checkParameterIsNotNull(arg, "arg");
  getSpecific(arg.getInnerType());
  throw null;  // <-- The problem
}
Run Code Online (Sandbox Code Playgroud)

如果我将函数签名更改getSpecific(clz: KClass<in U>) : U为以下任何一种形式:

  1. getSpecific(clz: KClass<out U>) : U
  2. getSpecific(clz: KClass<U>) : U
  3. getSpecific(clz: KClass<in U>) : BaseParameterizedType<*>

甚至是函数example(arg: KClass<out BaseParameterizedType<*>)或者example(arg: KClass<BaseParameterizedType<*>>),然后生成的代码是:

public static final void example(@NotNull KClass arg) {
  Intrinsics.checkParameterIsNotNull(arg, "arg");
  getSpecific(arg.getInnerType()); …
Run Code Online (Sandbox Code Playgroud)

kotlin

6
推荐指数
1
解决办法
134
查看次数

修改 ktors 调用协程上下文

因此,我正在使用ktor并希望通过ThreadLocal. 我正在看的是:

val dataThreadLocal = ThreadLocal<String>()
suspend fun fromOtherFunction() = "From other function -- ${dataThreadLocal.get()}"

routing {
    get("/hello") {
        // [1]
        launch(this.coroutineContext + dataThreadLocal.asContextElement(value = "world")) {
            val fromHere = async {
                "ThreadLocal value: ${dataThreadLocal.get()}"
            }

            val fromThere = async {
                fromOtherFunction()
            }

            call.respond(fromHere.await() + "," + fromThere.await())
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我正在做的是确保从父级launch(标记为 [1])调用的所有函数都可以访问这种“范围内”数据。

但是,我的应用程序非常大,我希望它适用于路由处理的所有请求,并且不希望每个路由都需要这种包装。

真正伟大的是:

intercept(ApplicationCallPipeline.Features) {
    launch(this.coroutineContext + dataThreadLocal.asContextElement(value = "world")) {
    ...
    }
}

routing {
    get("/hello") {
        val threadLocalValue = dataThreadLocal.get() …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-coroutines

6
推荐指数
1
解决办法
455
查看次数

带有 IntelliJ 的 Gradle 未将 PostgreSQL JDBC 作为依赖项加载

我正在尝试为我的下一个项目设置 IntelliJ 以及 Gradle 和 JOOQ。到目前为止,这就是我的 Gradle 文件的样子:

apply plugin: 'java'
apply plugin: 'jooq'

sourceCompatibility = 1.5
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

dependencies {
    compile 'org.jooq:jooq:3.1.0'
    compile 'com.google.guava:guava:14.0'
    compile 'postgresql:postgresql:9.1-901-1.jdbc4'
}

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        classpath 'postgresql:postgresql:9.1-901-1.jdbc4'
        classpath 'com.github.ben-manes:gradle-jooq-plugin:0.5'
    }
}

jooq {
   ... snip ...
}
Run Code Online (Sandbox Code Playgroud)

这就是我的外部依赖项(在 IntelliJ 中)的显示方式:

IntelliJ 中的外部依赖项窗格 .

不知何故,Gradle 正在下载,IntelliJ 将 jooq 和 guava 识别为我的依赖项的一部分,但 postgresql 没有出现。因此,在执行此操作时(使用 Guava,从 Gradle 加载的依赖项): …

java intellij-idea gradle maven

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

在Java中开发通用修饰符的正确方法

在Java中,我们有以下类型的函数:

public Collection<String> removeNulls(Collection<String> input) {
    List<String> output = new ArrayList<>();
    // ...
    return output;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我没有以任何方式修改输入,因为很多时候我们碰巧使用ImmutableListList.更常见的是,我们尽可能地确保函数的不变性.但是,我在这里看到的一个陷阱是,我的所有方法都经常使用自己的实现Collection.如果有人使用我的库正在使用LinkedList或者a Set或者a SortedSet,"查找是O(1)"或"列表总是排序" 这样的假设会在我的列表中调用我的函数时中断:

Set<String> mySet = new SortedSet<>();
mySet.add(10);
mySet.add(9); // I know that my collection is now sorted
Collection<String> myFilteredSet = removeNulls(mySet); // It is no longer sorted
Set<String> mySet = Sets.newSortedSet(myFilteredSet); // Have to sort it again
Run Code Online (Sandbox Code Playgroud)

在a的情况下LinkedList,这变得更加微妙,如果我的函数返回a List,那么我将继续使用该列表.它不会有任何编译时错误,我也不会看到问题.在前一种情况下,问题至少是可见的,因为我仍然必须将返回的Collection(或List)转换为Set,我知道是什么.问题只会在以后出现,如果有一些重要的处理依赖于LinkedList使用.一种理想的方式(但并不意味着"推荐")将是:

public List<String> removeNulls(List<String> input) {
    List<String> output …
Run Code Online (Sandbox Code Playgroud)

java oop generics collections

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

为什么 Jenkins 由于“路由已定义为对象路由”而无法构建 Play 项目?

我有一个 Play 项目,可以在我的 MacBook 上正常构建,但在 Ubuntu Server 14 上运行 Jenkins 的远程构建服务器上失败。构建失败,并出现以下错误:

[info] Compiling 7 Scala sources and 120 Java sources to /var/lib/jenkins/jobs/<redacted-projectname>/workspace/target/scala-2.11/classes...
[error] /var/lib/jenkins/jobs/<redacted-projectname>/workspace/conf/routes: routes is already defined as object routes
[error] /var/lib/jenkins/jobs/<redacted-projectname>/workspace/conf/routes: routes is already defined as class routes
[error] two errors found
Run Code Online (Sandbox Code Playgroud)

我的本地计算机上有时也会出现同样的问题,但我只需执行./activator clean( 或sbt clean) 即可正常工作。

Jenkins 构建配置文件是Execute Shell执行以下脚本的指令:

./activator clean dist
Run Code Online (Sandbox Code Playgroud)

我尝试重新创建项目,完全清理目录,但构建仍然失败。任何帮助将不胜感激。

sbt playframework-2.0 typesafe-activator

5
推荐指数
0
解决办法
800
查看次数

如何在Java 8中直接将函数用作函数类型

如果我创建一个功能界面:

@FunctionalInterface
public class Consumer2<T1, T2> {
    void accept(T1 t1, T2 t2);

    default Consumer1<T2> curry(T1 t1) {
        return (t2) -> accept(t1, t2);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我有一个班级:

public class MyClass {
    public void printStrings(String a, String b) {
        System.out.println(a + ": " + b);
    }
}

MyClass myClass = new MyClass();
Run Code Online (Sandbox Code Playgroud)

现在,如果我想使用我的功能界面,我可以:

Consumer2<String, String> printString = myClass::printStrings;
printString.curry("hello").accept("world");
Run Code Online (Sandbox Code Playgroud)

但我做不了类似的事情:

myClass::printStrings.curry("hello").accept("world");
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为Java无法知道myClass::printStrings可以应用于功能接口Consumer2.为此,我创建了一个实用程序类:

public class F {
    public static <T1, T2> Consumer2<T1, T2> c2(Consumer2<T1, T2> fn) {
        return fn;
    } …
Run Code Online (Sandbox Code Playgroud)

java functional-programming java-8 method-reference

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

在 jOOQ 中使用 unnest 作为字段而不是表

这是我尝试在 PostgreSQL 中运行的查询:

SELECT * FROM message WHERE id IN (
    SELECT unnest(message_ids) "mid"
        FROM session_messages WHERE session_id = '?' ORDER BY "mid" ASC
);
Run Code Online (Sandbox Code Playgroud)

但是,我无法做某事:

create.selectFrom(Tables.MESSAGE).where(Tables.MESSAGE.ID.in(
    create.select(DSL.unnest(..))
Run Code Online (Sandbox Code Playgroud)

因为DSL.unnest是 a Table<?>,这是有道理的,因为它试图获取List类似对象(主要是文字)并将其转换为表。

我有一种感觉,我需要找到一种方法将函数包装在我的字段名称周围,但我不知道如何继续。

笔记。该字段message_ids的类型为bigint[]

编辑

所以,这就是我现在正在做的事情,它的工作原理与预期完全一样,但我不确定这是否是最好的方法:

Field<Long> unnestMessageIdField = DSL.field(
                "unnest(" +  SESSION_MESSAGES.MESSAGE_IDS.getName() + ")",
                Long.class)
        .as("mid");

Field<Long> messageIdField = DSL.field("mid", Long.class);

MESSAGE.ID.in(
        ctx.select(messageIdField).from(
            ctx.select(unnestMessageIdField)
               .from(Tables.CHAT_SESSION_MESSAGES)
                    .where(Tables.CHAT_SESSION_MESSAGES.SESSION_ID.eq(sessionId))
            )
            .where(condition)
)
Run Code Online (Sandbox Code Playgroud)

编辑2

在浏览完https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/DSL.java上的代码后,我想正确的方法是:

DSL.function("unnest", SQLDataTypes.BIGINT.getArrayType(), SESSION_MESSAGES.MESSAGE_IDS)
Run Code Online (Sandbox Code Playgroud)

编辑3

由于卢卡斯一如既往地在这里解决我的 jOOQ 困境,我将利用这一点:)

尝试以某种签名形式概括此函数

public …
Run Code Online (Sandbox Code Playgroud)

postgresql jooq

4
推荐指数
1
解决办法
1471
查看次数