0

刚刚进入 Java 泛型,我遇到了一个问题:我似乎无法调用参数化类型的方法:

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( )
        {   }
    }       
}

我在这里想念什么?

4

3 回答 3

5

您已经声明了泛型类型参数Type,但它可以是任何东西,而不仅仅是 a foo,例如 a String

使用上限进行限制type,以便您知道它是某种foo

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

或者,只需在您的论点中要求 a foo,即可消除对泛型的任何需求:

public static void invoke_baz(Foo object)
于 2013-06-27T00:11:38.950 回答
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");
  }
}

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

于 2013-06-27T00:16:42.273 回答
0

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

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

如果提供的 object / type 不是 type ,这当然会产生转换错误SomeClass

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

public interface HaveBaz {
  baz();
}

并在您的泛型方法声明中请求该接口的子类型

public static < Type extends HaveBaz > void invoke_baz( Type object )
{
  object.baz();
}  
于 2013-06-27T00:17:06.520 回答