Java 如何调用参数化类型的方法?
跳转到Java泛型,我遇到了一个问题:我似乎无法调用参数化类型的方法:Java 如何调用参数化类型的方法?,java,generics,Java,Generics,跳转到Java泛型,我遇到了一个问题:我似乎无法调用参数化类型的方法: class test { public static void main( String args[ ] ) { invoke_baz( new foo( ) ); } public static < Type > void invoke_baz( Type object ) { object.baz( ); }
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( )
{ }
}
}
类测试
{
公共静态void main(字符串参数[])
{
调用_baz(新的foo());
}
公共静态void invoke_baz(类型对象)
{
baz();
}
公共静态类foo
{
公共图书馆()
{ }
}
}
这里缺少什么?您已经声明了泛型类型参数
type
,但它可以是任何东西,而不仅仅是foo
,比如字符串
用上限限制类型
,这样您就知道它是某种foo
:
public static <Type extends foo> void invoke_baz( Type object )
您已经声明了泛型类型参数type
,但它可以是任何东西,而不仅仅是foo
,例如字符串
用上限限制类型
,这样您就知道它是某种foo
:
public static <Type extends foo> void invoke_baz( Type object )
Java不是duck类型的,类型检查器无法意识到泛型方法正在调用一个方法,该方法可用于随后传递给该方法的对象。无论您的具体情况如何,它都必须正确检查通用代码
您需要通过显式声明类型变量被限制为特定的类层次结构来完成此操作,以便类型检查器可以对其进行假设:
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");
}
}
interface-bazable{
公共空间baz();
}
公共void调用(类型对象){
object.baz();
}
公共类Foo实现了bazable{
公共图书馆{
System.out.println(“baz”);
}
}
通过这种方式,您指定类型变量至少是一个bazable
,因此您将被限制只向方法传递某些类型,但在另一方面,您将能够调用bazable
中指定的任何方法,类型检查器无法意识到泛型方法正在调用一个方法,该方法在您随后传递给该方法的对象上可用。无论您的具体情况如何,它都必须正确检查通用代码
您需要通过显式声明类型变量被限制为特定的类层次结构来完成此操作,以便类型检查器可以对其进行假设:
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");
}
}
interface-bazable{
公共空间baz();
}
公共void调用(类型对象){
object.baz();
}
公共类Foo实现了bazable{
公共图书馆{
System.out.println(“baz”);
}
}
通过这种方式,您可以指定类型变量至少是一个bazable
,因此您将被限制只向方法传递某些类型,但在另一方面,您可以调用bazable
中指定的任何方法,因为它是一个泛型,在编译时不知道类型。编译器不知道类型是什么,您也不知道。一种方法是执行运行时强制转换。你首先需要决定你想要什么类型,你可以这样做:
public static < Type > void invoke_baz( Type object )
{
SomeClass someClass = (SomeClass) object;
someClass.baz();
}
并在泛型方法声明中请求该接口的子类型
public static < Type extends HaveBaz > void invoke_baz( Type object )
{
object.baz();
}
public staticvoid invoke_baz(类型对象)
{
object.baz();
}
您不能这样做,因为它是一个泛型——编译时不知道它的类型。编译器不知道类型是什么,您也不知道。一种方法是执行运行时强制转换。你首先需要决定你想要什么类型,你可以这样做:
public static < Type > void invoke_baz( Type object )
{
SomeClass someClass = (SomeClass) object;
someClass.baz();
}
并在泛型方法声明中请求该接口的子类型
public static < Type extends HaveBaz > void invoke_baz( Type object )
{
object.baz();
}
public staticvoid invoke_baz(类型对象)
{
object.baz();
}
+1对于使用多态性而不是泛型的建议,换句话说,Java泛型与其说是一种泛型编程工具,不如说是一种“一点语法糖”,可以让用户在某些情况下不必进行显式强制转换-明白了我想我将不得不依赖我在使用C语言时学到的老式的“复制、粘贴、搜索和替换”技术。Java中的泛型用于类(或方法)与特定但未知的类型有关系的情况。这里的类型是已知的:foo
,因此泛型是不必要的。是的,但是必须提供某种基类/接口/任何东西,这大大降低了泛型的实用性。我不禁想知道当他们决定去“类型删除”路线时,语言设计者们在想什么,而不是采用C++编译器……@ Sabas,它可能比C++模板(它们自己的问题集)在某些用途上不那么有用。但与使用原始类型相比,它仍然提供编译时类型检查的好处。+1对于使用多态性而不是泛型的建议,换句话说,Java泛型与其说是泛型编程工具,不如说是“一点语法糖”为了让用户不必在某些情况下进行显式强制转换—明白了!:)我想我将不得不依赖我在使用C语言时学到的老式的“复制、粘贴、搜索和替换”技术。Java中的泛型用于类(或方法)与特定但未知的类型有关系的情况。这里的类型是已知的:foo
,因此泛型是不必要的。是的,但是必须提供某种基类/接口/任何东西,这大大降低了泛型的实用性。我不禁想知道当他们决定去“类型删除”路线时,语言设计者们在想什么,而不是采用C++编译器……@ Sabas,它可能比C++模板(它们自己的问题集)在某些用途上不那么有用。但与使用原始类型相比,仍然提供编译时类型检查的好处。