相关疑难解决方法(0)

泛型返回类型上限 - 接口与类 - 令人惊讶的有效代码

这是来自第三方库API的真实示例,但已简化.

使用Oracle JDK 8u72编译

考虑这两种方法:

<X extends CharSequence> X getCharSequence() {
    return (X) "hello";
}

<X extends String> X getString() {
    return (X) "hello";
}
Run Code Online (Sandbox Code Playgroud)

两者都报告了"未经检查的演员"警告 - 我明白了.困扰我的是我为什么打电话

Integer x = getCharSequence();
Run Code Online (Sandbox Code Playgroud)

它编译?编译器应该知道Integer没有实现CharSequence.打电话给

Integer y = getString();
Run Code Online (Sandbox Code Playgroud)

给出错误(如预期的那样)

incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这种行为被认为是有效的?它会有用吗?

客户端不知道此调用是不安全的 - 客户端的代码在没有警告的情况下编译.为什么编译器不会警告/发出错误?

另外,它与这个例子有什么不同:

<X extends CharSequence> void doCharSequence(List<X> l) {
}

List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles

List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // …
Run Code Online (Sandbox Code Playgroud)

java generics java-8

170
推荐指数
2
解决办法
3万
查看次数

Java 8泛型函数应该是模糊的,但在运行时失败

我正在尝试将Java 7代码迁移到Java 8,所以我的代码类似于:

package tests;

import java.util.Arrays;
import java.util.Map;

public class Tests {
    private static interface ComparableMap<K,V> extends Map<K,V>, Comparable {}

    public static void main(String[] args) {
        func(getString());
    }

    private static void func(Comparable...input){
        System.out.println(Arrays.toString(input));
    }

    private static void func(ComparableMap <?,?> m){
        System.out.println(m);
    }

    private static <T extends Comparable> T getString(){
        return (T) "aaa";
    }
}
Run Code Online (Sandbox Code Playgroud)

在java 7中它正常工作,在Java 8中我得到:

java.lang.ClassCastException:java.lang.String无法强制转换为tests.Tests $ ComparableMap

如果我将一个函数定义更改为:

    private static <T> T getString(){
        return (T) "aaa";
    }
Run Code Online (Sandbox Code Playgroud)

编译将失败:错误:

对func的引用含糊不清

为什么Java 8编译器在第一种情况下没有失败?(看起来对我来说是错误的)是否可以更改第二个重载函数,以便在不更改调用本身的情况下使用varargs参数调用第一个函数?

java generics variadic-functions overload-resolution java-8

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