Java接口设计

Java接口设计,java,Java,我最初有一个界面,如下所示 public interface testMe { public Set<String> doSomething(); } public class A implements testMe { public Set<String> doSomething() { return // Set<String> } } 公共接口testMe{ 公共设置doSomething();

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

public interface testMe {
      public Set<String> doSomething();
}
public class A implements testMe {
      public Set<String> doSomething() {
           return // Set<String>
      }
}
公共接口testMe{
公共设置doSomething();
}
公共类A实现testMe{
公共设置剂量计(){
返回//集
}
}
我有类似的类来实现testMe。现在我必须再添加一个返回
Set

public类X实现testMe(){
公共设置剂量计(){
}
}

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

原因有二

  • 一个类或接口不能有两个或多个方法,它们的参数数量和类型相同,名称相同,但返回类型不同;及

  • 由于类型擦除,所有
    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() { ... }
    }
    
    公共接口TestMe{
    设置doSomething();
    }
    公共类A实现TestMe{
    @凌驾
    公共集doSomething(){…}
    }
    公共类X实现TestMe{
    @凌驾
    公共集doSomething(){…}
    }
    
    您可以使用

    public interface testMe {
       public Set<?> doSomething();
    }
    
    公共接口testMe{
    公共设置doSomething();
    }
    

    公共接口testMe{
    
    公共集我不相信你能,因为类型擦除会破坏你心目中的效果

    您可以参数化接口:

    import java.util.Set;
    
    public interface ISomething<T>
    {
        Set<T> doSomething(T [] data);
    }
    
    import java.util.Set;
    公共接口
    {
    设置剂量测量(T[]数据);
    }
    
    以及实施:

    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;
        }
    }
    
    import java.util.HashSet;
    导入java.util.Set;
    公共类的东西
    {
    公共静态void main(字符串[]args)
    {
    新事物;
    Set=something.doSomething(args);
    系统输出打印项次(套);
    }
    公共设置剂量测量(T[]数据)
    {
    Set foo=new HashSet();
    对于(T x:数据)
    {
    foo.add(x);
    }
    返回foo;
    }
    }
    

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

    这里的问题是,我没有直接实例化具体的类,而是封装在工厂方法中。一个如何围绕它编写工厂方法,返回ISomething以及ISomething。如果我们甚至参数化工厂,那么问题就转移到了方法。它必须决定返回什么。
    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;
        }
    }