【问题标题】:Java Generic Interface Return TypeJava 通用接口返回类型
【发布时间】:2017-05-01 13:07:41
【问题描述】:

从 C++ 迁移到 Java。

我有一个第三方代码,其中包含我需要实现的接口,类似于这样。

public interface Foo<T>{
       public T doSomething();
}

我想实现这个接口,这样我就可以调用 doSomething() 并获得 3 个不同的类 A, B and C,它们扩展了一个公共基础 Z,如下所示。

public class A extends Z{...};
public class B extends Z{...};
public class C extends Z{...};

我找不到任何方法来避免编写以下 3 个类。

public class ARet implements Foo<A>{...}
public class BRet implements Foo<B>{...}
public class CRet implements Foo<C>{...}

对于给定的接口Foo,是否不可能编写一个返回T extends Z 的实现,它看起来像public class Ret implements Foo&lt;T extends Z&gt;{...}。这似乎不起作用。有什么办法可以避免这 3 个课程或没有办法绕过它?

【问题讨论】:

    标签: java generics design-patterns interface


    【解决方案1】:

    如果希望接口的实现是泛型的,则需要将 T 声明为 Ret 的泛型类型参数:

    public class Ret<T extends Z> implements Foo<T>{...}
    

    【讨论】:

    • 注意接口中的函数签名T doSomething()。它将返回一个类型 T 而不会将 T 对象作为参数之一。这意味着要返回的对象T 必须在函数doSomething() 中创建。虽然我是 Java 新手,但我的理解是,由于类型擦除,这是不可能的。还是我误解了这些概念?
    • @cplusplusrat 这也可能意味着实现类有一个set(T object) 或其他将T 实例传递给实现类实例的方法,而您的something() 方法返回实例。这类似于java.util.List&lt;T&gt; 接口,其get(int i) 方法返回一个T 实例。 T 实例不能在 doSomething() 方法中创建,除非您将 Class&lt;T&gt; 参数传递给它。
    • 好的,所以为了让您的解决方案正常工作,没有转义 setter 方法,以便doSomething() 拥有可以处理和返回的对象。这就是我的想法,但需要第二个意见。谢谢。我会将其标记为已解决。
    猜你喜欢
    • 2011-01-25
    • 2018-02-23
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多