首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java接口设计

Java接口设计
EN

Stack Overflow用户
提问于 2010-06-02 09:06:07
回答 3查看 399关注 0票数 3

我最初有一个界面,如下所示。

代码语言:javascript
复制
public interface testMe {
      public Set<String> doSomething();
}
public class A implements testMe {
      public Set<String> doSomething() {
           return // Set<String>
      }
}

我有类似的实现testMe的类。现在我必须再添加一个返回Set<Some Object>的类

代码语言:javascript
复制
public class X implements testMe() {
     public Set<Some OBject> doSomething() {
     }
}

如何在不破坏现有类的情况下在接口中添加此方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-02 09:15:42

你不能这样做有两个原因。

  1. 类或接口不能有两个或多个具有相同数量和类型的参数且具有相同名称但返回类型不同的方法;和
  2. 由于类型擦除,所有Set<...>实例在运行时都是简单的Set,因此它们无论如何都将具有完全相同的返回类型。

您需要给第二个命名为不同的名称。

更复杂的答案是,您可以使参数类型可扩展:

代码语言:javascript
复制
public interface TestMe<T extends Serializable> {
  Set<T> doSomething();
}

public class A implements TestMe<String> {
  @Override
  public Set<String> doSomething() { ... }
}

public class X implements TestMe<ASerializableObject> {
  @Override
  public Set<ASerializableObject> doSomething() { ... }
}
票数 2
EN

Stack Overflow用户

发布于 2010-06-02 09:16:36

您可以使用

代码语言:javascript
复制
public interface testMe {
   public Set<?> doSomething();
}

代码语言:javascript
复制
public interface testMe {
   public Set<? extends CommonSuperclass> doSomething();
}
票数 5
EN

Stack Overflow用户

发布于 2010-06-02 09:17:53

我不相信你可以,因为类型擦除会破坏你所想要的效果。

您可以参数化该接口:

代码语言:javascript
复制
import java.util.Set;

public interface ISomething<T>
{
    Set<T> doSomething(T [] data);
}

以及实现方法:

代码语言:javascript
复制
import java.util.HashSet;
import java.util.Set;

public class Something<T> implements ISomething<T>
{
    public static void main(String[] args)
    {
        Something<String> something = new Something<String>();

        Set<String> set = something.doSomething(args);
        System.out.println(set);
    }

    public Set<T> doSomething(T [] data)
    {
        Set<T> foo = new HashSet<T>();

        for (T x : data)
        {
            foo.add(x);
        }

        return foo;
    }
}

不过,我不确定这是否实现了您的想法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2954378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档