cho lớp sau:đoạn mã sau nên biên dịch theo Java 1.8
public class FooTest {
public static class Base {
}
public static class Derived extends Base {
}
public interface Service<T extends Base> {
void service(T value);
}
public abstract class AbstractService<T extends Derived> implements Service<T> {
public void service(T value) {
}
}
private AbstractService service;
public void bar(Base base) {
if(base instanceof Derived) {
service.service(base); // compile error at this line
}
}
}
Khi xây dựng các lớp học với các pom.xml
sau:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mgm-tp</groupId>
<artifactId>java-compiler-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerId>eclipse</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-eclipse</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
trong maven 3.4 nó tạo ra lỗi biên dịch sau:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project java-compiler-test: Compilation failure [ERROR] C:\Users\abrieg\workingcopy\java-compiler-test\src\main\java\FooTest.java:[25] The method service(FooTest.Base) in the type FooTest.Service is not applicable for the arguments (FooTest.Base)
Khi đặt nguồn và cấp mục tiêu thành 1,7 cho trình biên dịch eclipse hoặc khi sử dụng javac
làm trình biên dịch không có lỗi biên dịch được báo cáo.
Câu hỏi là wheter JLS 1.8 cụ thể hơn về kiểu suy luận sao cho mã này thực sự không được cho phép như trình biên dịch eclipse cho java 1.8 hoặc nếu đây là hồi quy trong trình biên dịch eclipse.
Dựa trên văn bản của lỗi trình biên dịch, tôi có xu hướng nói hồi quy của nó, nhưng tôi không chắc chắn.
tôi đã xác định được hai lỗi sau đây đã báo cáo với JDT, nhưng tôi nghĩ rằng họ không áp dụng chính xác:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=432603 https://bugs.eclipse.org/bugs/show_bug.cgi?id=430987
Nếu đây là một hồi quy, đã này đã được báo cáo JDT?
Đó biên dịch tốt với javac - vấn đề này có lẽ eclipse cụ thể ... – assylias
@assylias tốt, đó là câu hỏi. JLS là tài liệu tham khảo và jether javac hoặc trình biên dịch jdt eclipse thực hiện nó đúng. – SpaceTrucker
Nhưng tại sao? dịch vụ mong đợi một T mở rộng có nguồn gốc, nhưng nhận được một đối tượng cơ sở (mặc dù nó được kiểm tra để thực sự là một thể hiện của Derived, và có thể được đúc. –