Java接口设计

3

我最初的接口如下所示。

public interface testMe {
      public Set<String> doSomething();
}
public class A implements testMe {
      public Set<String> doSomething() {
           return // Set<String>
      }
}

我之前有实现testMe的类似情况。现在我需要添加一个返回Set<Some Object>的类。

public class X implements testMe() {
     public Set<Some OBject> doSomething() {
     }
}

我该如何在不影响现有类的情况下,在接口中添加这个方法?
3个回答

5

您可以使用

public interface testMe {
   public Set<?> doSomething();
}

或者

public interface testMe {
   public Set<? extends CommonSuperclass> doSomething();
}

2
你不能这样做,有两个原因。
1. 一个类或接口不能有两个或更多方法,这些方法具有相同数量和类型的参数,但返回类型不同;
2. 由于类型擦除的缘故,所有 Set<...> 实例在运行时都是简单的 Set,因此它们将具有完全相同的返回类型。
你需要给第二个命名为不同的名称。
更复杂的答案是,你可以使参数类型可扩展。
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

我不认为你能够做到,因为类型擦除会破坏你所想要的效果。

你可以对接口进行参数化:

import java.util.Set;

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

实现方式如下:
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;
    }
}

我不确定这是否能达到你的意图,但是。

问题在于,我没有直接实例化具体类,而是封装在工厂方法中。如何编写围绕它返回ISomething<String>和ISomething<Some Object>的工厂方法?如果我们将工厂参数化,那么问题就转移到了方法的使用者身上。它必须决定返回什么。 - Nayn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接