【发布时间】:2019-08-27 16:24:13
【问题描述】:
我有以下代码:
Main.java
public class Main {
public static void main(String[] args) {
TestProducer c = Test::<String>new;
System.out.println(c.produce("Point"));
}
}
Test.java
public class Test<N extends CharSequence> {
private CharSequence name;
public Test(N k) {
name = k;
}
public String toString() {
return name.toString();
}
}
TestProducer.java
@FunctionalInterface
public interface TestProducer {
public <N extends CharSequence> Test<N> produce(N str);
}
当我编译代码时,它会产生以下错误:
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
> javac -classpath .:/run_dir/junit-4.12.jar -d . Main.java Test.java TestProducer.java
Main.java:3: error: invalid constructor reference
TestProducer c = Test::<String>new;
^
cannot use raw constructor reference with explicit type parameters for constructor
1 error
compiler exit status 1
我有以下问题:
- 这里的“原始构造函数引用”是什么(这里的“显式类型参数”是
<String>)? - 为什么不能“使用原始构造函数引用和构造函数的显式类型参数”(推理/为什么这不是一个好主意)?
- 如何解决这个错误(创建一个只接受
Strings 的TestProducer)?
编辑:
关于避免错误,以下是我的发现:
我可以将TestProducer 修改为以下内容:
@FunctionalInterface
public interface TestProducer<N extends CharSequence>
{
public Test<N> produce(N str);
}
然后像这样更改Main.java:
public class Main {
public static void main(String[] args) {
TestProducer<String> c = Test::new;
System.out.println(c.produce("Point"));
}
}
通过这样做,c::produce 将只接受 Strings,这符合我对问题 3 的意图。问题 1 和问题 2 仍不清楚。
【问题讨论】:
标签: java compiler-errors