问题 类型变量如何允许错误类型?


package org.my.java;

public class TestTypeVariable {

    static <T,A extends T> void typeVarType(T t, A a){
        System.out.println(a.getClass());
        System.out.println(t.getClass());
    }

    public static void main(String[] s){
        int i= 1;
        typeVarType("string", i);
    }
}

运行时,以下是输出:

class java.lang.Integer
class java.lang.String

怎么能 A 是类型 Integer 什么时候它已经上限了 String

请解释我。


2596
2017-09-25 08:15


起源

我无法编译您的示例:绑定不匹配:类型TestTypeVariable的泛型方法typeVarType(T,A)不适用于参数(String,Integer)。推断类型Integer不是有界参数的有效替代<A extends T>这是我所期望的。你成功编译了源代码吗? - SilverNak
随着编译器的解决 T 至 Object 和 A 至 Integer,没有问题。 - daniu
@SilverNak它在Java 8中传递编译,但在Java 7中不传递。 - Eran
这篇文章已经回答了这个问题 stackoverflow.com/questions/12475050/... - thedevd
欢迎来到开发人员学习,分享和建立职业的地方!我注意到你的问题仍然是“开放的” - 因为你没有接受答案。请看看并决定是否要 接受 一个答案。或者让我知道我是否可以采取一些措施来增强我的投入以使其值得接受。接受有助于未来的读者确定问题是否得到解决,并表示感谢那些花时间回答你的人。谢谢! - GhostCat


答案:


这里有两件事:

  • 对于“坏”打字有一个简单的解决方案:T不是String而是 目的。和 整数 extends Object。但请注意:这仅适用于Java8的“增强”类型推断功能。使用Java7,您的输入将无法编译!
  • 对你的误解: getClass() 发生在 运行,因此返回传递的对象的特定类 - 独立于编译器在编译时对泛型的看法。

15
2017-09-25 08:18



它汇编很好。 typeVarType("string", i); 具有 T=Object, A=Integer 。 - khelwood
它是可编辑和可运行的。 getClass()我只是用来打印对象的运行时类型。但这不是问题。要点是java如何允许整数类型为字符串上限类型 - Atul
@khelwood当没有进一步检查而相信其他评论时,就会发生这种情况。我自己认为“T应该是对象”...谢谢,并更新。 - GhostCat
它在Java 8中编译得很好,但是在Java 7中没有通过编译。在这种情况下,我认为它更有意义,因为它不通过编译,因为 <T,A extends T> 毫无意义(由于类型擦除)。 - Eran
当然,推断类型为 T 也可能是 Object & Serializable & Comparable<?>... - Holger