Java instanceof和泛型的编译错误 公共A类{ 公共接口I{ 公共整数toInt(tx); } 公共静态int t(字符串s,I){ //System.out.println(i的i个实例); 返回i.toInt(s); } 公共静态整数g(S S,I){ 返回i.toInt(s); } 公共静态void main(字符串[]args){ 系统输出println(t(“dcba”,s->(int)(s.charAt(0)+'a')); } }

Java instanceof和泛型的编译错误 公共A类{ 公共接口I{ 公共整数toInt(tx); } 公共静态int t(字符串s,I){ //System.out.println(i的i个实例); 返回i.toInt(s); } 公共静态整数g(S S,I){ 返回i.toInt(s); } 公共静态void main(字符串[]args){ 系统输出println(t(“dcba”,s->(int)(s.charAt(0)+'a')); } },java,generics,java-8,Java,Generics,Java 8,为什么方法g无法通过编译?为什么方法t中的行System.out.println(i instanceof i)无法通过编译?g不能在其签名中使用泛型类型参数t,因为该参数仅为接口i声明 您可能应该将其签名更改为: public class A { public interface I<T> { public Integer toInt(T x); } public static int t(String s, I<String>

为什么方法
g
无法通过编译?为什么方法
t
中的行
System.out.println(i instanceof i)
无法通过编译?

g
不能在其签名中使用泛型类型参数
t
,因为该参数仅为接口
i
声明

您可能应该将其签名更改为:

public class A {
    public interface I<T> {
        public Integer toInt(T x);
    }
    public static int t(String s, I<String> i) {
        // System.out.println(i instanceof I<Integer>);
        return i.toInt(s);
    }
    public static <S> int g(S s, I<T> i){
        return i.toInt(s);
    }
    public static void main (String[] args) {
        System.out.println(t("dcba", s->(int)(s.charAt(0)+'a')));
    }
}
publicstaticintg(S,I)
i instanceof i
不会通过编译,因为泛型类型信息在编译过程中被擦除,所以在运行时不可用

这正是编译器告诉您的:

无法对参数化类型
A.I
执行instanceof check。改用
A.I
格式,因为更多的泛型类型信息将在运行时被删除


“g不能在其签名中使用泛型类型参数T”,因此它可以是参数“K”?你为什么选择“s”?@shosh你选择了
s
。您为静态方法
g
声明了一个泛型类型参数
,并且对
S
参数和
i
参数使用
S
似乎是有意义的,因为您将
S
传递给
i.toInt()
。另一个选项:
公共静态int g(S,i)
。未测试,至少可能无法与您的消息正文一起使用。@OleV.V。不,它不起作用,因为
I
toInt
方法需要一个
t
参数,而不是
S
参数。@shosh这两种方法都可以起作用,因为Integer可以自动取消绑定到int。也就是说,除非
Integer-toInt(tx)
可能返回null,在这种情况下,
t
g
方法将抛出
NullPointerException
public static <S> int g(S s, I<S> i)