如何调用参数化类型的方法?

时间:2013-06-27 00:09:50

标签: java generics

刚刚进入Java Generics并且我遇到了一些问题:我似乎无法调用参数化类型的方法:

class test 
{
    public static void main( String args[ ] )
    {    
        invoke_baz( new foo( ) );
    }
    public static < Type > void invoke_baz( Type object )
    {
        object.baz( );
    }   
    public static class foo
    {
        public void baz( )
        {   }
    }       
}

我在这里缺少什么?

3 个答案:

答案 0 :(得分:5)

您已声明了通用类型参数Type,但它可以是任何内容,而不仅仅是foo,例如String

使用上限限制type,以便您知道某种foo

public static <Type extends foo> void invoke_baz( Type object )

或者,只需在你的论证中要求foo,删除对泛型的任何需求:

public static void invoke_baz(Foo object)

答案 1 :(得分:0)

Java不是类型,类型检查器无法实现泛型方法正在调用您正在传递给该方法的对象上可用的方法。无论您的具体情况如何,它都必须正确检查通用代码。

您需要通过明确声明类型变量仅限于某个类的层次结构来完成此操作,以便类型检查器可以对其进行假设:

interface Bazzable {
  public void baz();
}

public <Type extends Bazzable> void invoke(Type object) {
  object.baz();
}

public class Foo implements Bazzable {
  public void baz() {
    System.out.println("baz");
  }
}

通过这种方式,您指定类型变量至少为Bazzable,因此您将被限制为仅将某些类型传递给方法,但另一方面,您将能够调用指定的任何方法在Bazzable

答案 2 :(得分:0)

你不能因为它是泛型类型在编译时是不可知的。编译器不知道类型是什么 - 你也不知道。一种方法是进行运行时强制转换。您首先需要确定您期望的类型,并且您可以执行以下操作:

public static < Type > void invoke_baz( Type object )
{
    SomeClass someClass = (SomeClass) object;
    someClass.baz();
}  

如果提供的对象/类型不是SomeClass类型,则会导致出现错误。

更好的方法是声明一个确保方法合同的接口,例如:

public interface HaveBaz {
  baz();
}

在泛型方法声明

上请求该接口的子类型
public static < Type extends HaveBaz > void invoke_baz( Type object )
{
  object.baz();
}