相关疑难解决方法(0)

为什么带绑定的泛型方法可以返回任何类型?

为什么以下代码编译?该方法IElement.getX(String)返回该类型IElement或其子类的实例.类中的代码Main调用该getX(String)方法.编译器允许将返回值存储到类型的变量中Integer(显然不在层次结构中IElement).

public interface IElement extends CharSequence {
  <T extends IElement> T getX(String value);
}

public class Main {
  public void example(IElement element) {
    Integer x = element.getX("x");
  }
}
Run Code Online (Sandbox Code Playgroud)

返回类型是否仍然是一个实例IElement - 即使在类型擦除之后?

getX(String)方法的字节码是:

public abstract <T extends IElement> T getX(java.lang.String);
flags: ACC_PUBLIC, ACC_ABSTRACT
Signature: #7                           // <T::LIElement;>(Ljava/lang/String;)TT;
Run Code Online (Sandbox Code Playgroud)

编辑:替换String与一致Integer.

java generics type-inference generic-method

33
推荐指数
1
解决办法
1418
查看次数

Java类型推断:Java 8中的引用不明确,但Java 7则不然

假设我们有2节课.一个空类Base,以及该类的子类Derived.

public class Base {}

public class Derived extends Base {}
Run Code Online (Sandbox Code Playgroud)

然后我们在另一个类中有几个方法:

import java.util.Collection

public class Consumer {

    public void test() {
        set(new Derived(), new Consumer().get());
    }

    public <T extends Base> T get() {
        return (T) new Derived();
    }

    public void set(Base i, Derived b) {
        System.out.println("base");
    }

    public void set(Derived d, Collection<? extends Consumer> o) {
        System.out.println("object");
    }

}
Run Code Online (Sandbox Code Playgroud)

这在Java 7中成功编译并运行,但不能在Java 8中编译.错误:

Error:(8, 9) java: reference to set is ambiguous
  both method set(Base,Derived) in Consumer …
Run Code Online (Sandbox Code Playgroud)

java generics type-inference compiler-errors java-8

26
推荐指数
2
解决办法
5277
查看次数

Java 8中的模糊方法,为什么?

public static void main(String... args){
    then(bar()); // Compilation Error
}

public static <E extends Exception> E bar() {
    return null;
}

public static void then(Throwable actual) { }

public static void then(CharSequence actual) { }
Run Code Online (Sandbox Code Playgroud)

编译结果(来自命令行javac Ambiguous.java)

Ambiguous.java:4: error: reference to then is ambiguous
        then(bar());
        ^
  both method then(Throwable) in Ambiguous and method then(CharSequence) in Ambiguous match
1 error
Run Code Online (Sandbox Code Playgroud)

为什么这种方法含糊不清?这段代码在Java 7下成功编译!

将方法栏更改为:

public static <E extends Float> E bar() {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

这编译没有任何问题,但在IntelliJ Idea(无法解析方法then(java.lang.FLoat))中报告为错误.

此代码在Java …

java generics ambiguous java-7 java-8

16
推荐指数
1
解决办法
5143
查看次数

是否应在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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下内容构建类时pom.xml:

<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> …
Run Code Online (Sandbox Code Playgroud)

java eclipse jls language-lawyer java-8

14
推荐指数
1
解决办法
1015
查看次数