【问题标题】:Generic method with extend in javajava中带有扩展的通用方法
【发布时间】:2017-11-29 02:12:19
【问题描述】:

我有一个带有泛型方法的类 TestClass。但是当我运行 带有这些参数的method1可以正常执行。 我错过了什么吗?由于对象没有扩展 Integer,method1 是否应该抛出异常?

 TestClass i = new TestClass();
 i.method1(new Object(), new Integer(2));


  public class TestClass {

        protected final int testClassvar1=2;

        public <E,T extends E> void method1(T t,E e) {
        System.out.println(e.getClass()); 
       }
   }

【问题讨论】:

  • 仍然对此感到困惑,但与此同时this might help you
  • 似乎唯一的方法是定义TestClass&lt;E&gt;,然后在方法的类型签名中只放&lt;T extends E&gt;,尽管我仍然完全不知道为什么你的代码没有'不会导致编译器死机...
  • 您没有提供仿制药的信息。使用i.&lt;Object, Integer&gt;method1() 否则它将假定
  • @SungJinSteveYoo 哦,聪明的我现在明白了。是的,我今天也学到了一些新东西,事实证明。 :D

标签: java generics netbeans


【解决方案1】:

调用泛型方法时没有设置具体类型,所以编译器理解为i.&lt;Object, Object&gt; method1(new Object(), new Integer(2));

【讨论】:

  • Oracle 教程泛型没有显示这个方法。我们应该怎么知道这个?还有其他方法吗?
【解决方案2】:

为了在编译时强制约束 T extends E,当你调用方法时,你需要指定将替换参数化类型的类型。否则,两种类型都假定为 Object。

i.<Object,Integer>method1(new Object(), new Integer(2));

【讨论】:

    【解决方案3】:

    method1 总是能够接受任何引用类型的两个参数,因为TE 可以选择为Object,并且任何引用类型都是Object 的子类型。所以method1 还不如声明为public void method1(Object t, Object e);没什么区别。它的声明方式,method1 不能用它的任何一个参数做任何事情,除了可以用Object 做的事情,因为类型变量没有限制(所以 Java 不会让程序员做除了Object 所能做的事情之外的任何事情)。 (这里,该方法唯一要做的就是在e 上调用.toString(),这是由Object 提供的。)因此,除了它们都是Object 之外,没有任何限制的理由。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多