当前位置: 首页 > 面试题库 >

通用方法返回类型

范鸿
2023-03-14
问题内容

这就是我想要做的。使用反射,我想获取所有方法及其返回类型(非泛型)。我一直Introspector.getBeanInfo在这样做。但是,当我遇到返回类型未知的方法时,我遇到了限制。

public class Foo {

    public String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

public class Bar<T> {

    T object;

    public T getObject() {
        return object;
    }

    public void setObject(final T object) {
        this.object = object;
    }
}

@Test
    public void testFooBar() throws NoSuchMethodException, SecurityException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {

        Foo foo = new Foo();
        Bar<Foo> bar = new Bar<Foo>();
        bar.setObject(foo);
        Method mRead = bar.getClass().getMethod("getObject", null);

        System.out.println(Foo.class);// Foo
        System.out.println(foo.getClass());// Foo
        System.out.println(Bar.class);// Bar
        System.out.println(bar.getClass());// Bar
        System.out.println(mRead.getReturnType()); // java.lang.Object
        System.out.println(mRead.getGenericReturnType());// T
        System.out.println(mRead.getGenericReturnType());// T
        System.out.println(mRead.invoke(bar, null).getClass());// Foo
    }

我如何知道方法的返回类型T是否通用?我没有奢求在运行时拥有对象。我正在尝试使用Google
TypeToken或使用抽象类来获取类型信息。我想关联T到对象FoogetObject方法Bar<Foo>

有人认为Java不保留通用信息。在这种情况下,为什么第一次强制转换有效而第二次强制转换无效。

Object fooObject = new Foo();
bar.setObject((Foo) fooObject); //This works
Object object = 12;
bar.setObject((Foo) object); //This throws casting error

任何帮助表示赞赏。


问题答案:

Bar bar = new Bar ();
Method mRead = bar.getClass().getMethod( “getObject”, null );
TypeToken > tt = new TypeToken >() {};
Invokable , Object> inv = tt.method( mRead );
System.out.println( inv.getReturnType() ); // Test$Foo


也许这就是您要搜索的。TypeToken和Invokable来自Google Guava。

€:修复了有关@PaulBellora注释的代码



 类似资料:
  • 问题内容: 考虑以下示例(OOP书籍中的典型示例): 我有一Animal堂课,每个人Animal可以有很多朋友。 和子类喜欢Dog,Duck,Mouse等里面加如特定行为bark(),quack()等等。 这是Animal课程: 这是一些带有大量类型转换的代码片段: 有什么办法可以将泛型用于返回类型来摆脱类型转换,所以我可以说 这是一些带有返回类型的初始代码,这些代码作为从未使用过的参数传递给该方

  • 问题内容: 可能是之前问过的一个问题,但是像往常一样,第二个提到“通用”一词时,您会得到一千个答案,以解释类型擦除。我很早以前就经历了这一阶段,现在对泛型及其使用有了很多了解,但是这种情况稍微有些微妙。 我有一个表示电子表格中数据单元格的容器,该容器实际上以两种格式存储数据:既作为显示字符串,也取决于数据(作为对象存储)为另一种格式。该单元格还包含一个在类型之间转换的转换器,并且还对类型进行有效性

  • 问题内容: 假设我有一个超类,它定义了以下抽象方法 现在,如果我想在某些子类中覆盖它 我收到有关类型安全和未经检查的转换的警告: 类型安全:返回类型为从类型需要选中转换,以符合从类型 没有下摔倒,如果?有什么办法可以适当消除警告吗? 问题答案: 重写方法的返回类型必须是重写方法的返回类型的子类型。 不是where 的子类型。T在这里未知。 是每个子类型化规则的的子类型。 有关通配符的一些子类型化规

  • 问题内容: 今天,我偶然发现了一些我什至没想到可以编译的Java代码。减少到最低限度,它看起来像这样: 乍一看,类型参数的的方法和期待,因为没有必要,不使用其他任何地方。无论如何,我发现这在允许冲突的返回值类型共存于同一实现中起着至关重要的作用:如果忽略了一个或两个,则代码不会编译。这里是非工作版本: 我不需要修复上面的代码片段,因为这些只是我用来解释我观点的示例。我只是想知道为什么编译器对它们的

  • 本文向大家介绍Android 通过jni返回Mat数据类型方法,包括了Android 通过jni返回Mat数据类型方法的使用技巧和注意事项,需要的朋友参考一下 Android 开发过程中为了实现代码的高效性,通常要调用本地c++代码,JNI是java语言提供的和c/c++相互沟通的机制,在使用opencv做图像处理时,通常要调用c/c++代码进行相关操作,将处理后的结果返回java进行显示或者其他

  • 它遵循常用的习惯用法。我可以提供一个函数来执行我想要的操作,但是如果可能的话,我更希望重载这个名称。您将如何克服类型族的这种限制?