2010-06-02 76 views
3

我有一个界面最初如下。Java界面设计

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() { 
    } 
} 

我怎么会在界面中添加这种方法不会破坏现有的类?

回答

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() { ... } 
} 
5

您可以使用

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

或者

public interface testMe { 
    public Set<? extends CommonSuperclass> 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; 
    } 
} 

我不知道该完成的任务,你必须记住,虽然。

+0

这里的问题是,我没有直接实例化具体类,而是封装在工厂方法中。如何在周围写回工厂方法返回ISomething 以及ISomething 。如果我们甚至参数化工厂,那么问题就转移到方法的使用者身上。它必须决定返回的内容。 – Nayn 2010-06-02 01:47:48