2016-08-16 84 views
2
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'))); 
    } 
} 

为什么方法g无法通过编译?为什么方法t中的行System.out.println(i instanceof I<Integer>)无法通过编译?编译错误instanceof和泛型

回答

4

g不能在其签名中使用通用类型参数T,因为该参数仅针对接口I声明。

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

public static <S> int g(S s, I<S> i) 

i instanceof I<Integer>因为泛型类型信息在编译时删除不通过编译,所以它在运行时的不可用。

这正是编译器会告诉你:

无法执行instanceof检查对参数化类型A.I<Integer>。使用表格A.I<?>,因为进一步的通用类型信息将在运行时被删除

+0

“g不能在其签名中使用泛型类型参数T”,所以它可以是参数“K”吗?你为什么选择“s”? – shosh

+1

@shosh你选择了'S'。你为静态方法'g'声明了一个泛型类型参数'',因为你将's'传递给''''参数和'i'参数似乎对's'参数和' i.toInt()'。 – Eran

+0

另一种选择:'公共静态 int g(S s,I i)'。未经测试,可能不适用于您的消息正文。 –