2011-08-28 90 views
1

我的计算机上有一个程序模拟互联网上的服务器,假服务器需要能够向某些类发送多个数据类型。例如,在程序的一个点上,服务器需要将一个int发送给一个类,然后将该int转换为一个字符串并将其发送给另一个。如何让方法具有不同的输入类型java

基本上我问的是,如果一个方法可以有多个数据类型的输入(这是否有意义?如果没有生病尝试解释更好)。有没有办法做到这一点,而不创建许多不同的方法?

编辑:也就是有没有办法告诉传入的类型之间的差异(以防止错误)

+0

您能张贴一些示例代码吗? –

回答

2

如果我理解正确的叫,你问如果一个方法foo()可以有多个不同的输入,其参数

这样foo(Integer i)foo(String s)被包围以同样的方法。

答案:是的,但它不是漂亮

foo(Object o)

是您的方法声明

现在,你需要理清不同类型的可能性

if(o instanceof Integer){ 
    stuff(); 
} else if (o instanceof String){ 
    moreStuff(); 
} 

刚刚链其他/ if语句为期望的结果。

3

你可以拥有这需要Object这是任何类型的方法。在Java 5.0和更高版本中,原语将被自动装箱并作为对象传递。

void method(Object o); 

可以使用

method(1); 
method("hello world"); 
method(new MyClass()); 
method(null); 
+0

好..可能是他想要的。但是重载方法更简单,因为在任何情况下,他都应该使用instanceof对方法进行多重检查。 – Heisenbug

+0

这可能是这种情况,但这取决于OP对该对象所做的事情。如果它的'toString()'或'ObjectOutputStream.writeObject()'没有关系。 –

+0

+1:是的,你说得对。我删除了我的答案。 – Heisenbug

0

你想要的是通用方法或类。 检查的对象是你必须使用“的instanceof”方法

你可以让整个类通用或只是一个单一的方法,一个泛型类的例子是什么类型:

package javahowto; 
public class Member<T> { 
private T id; 
public Member(T id) { 
    this.id = id; 
} 
public T getId() { 
    return id; 
} 
public void setId(T id) { 
    this.id = id; 
} 
public static void main(String[] args) { 
    Member<String> mString = new Member<String>("id1"); 
    mString.setId("id2"); 
    System.out.printf("id after setting id: %s%n", mString.getId()); 
    //output: id after setting id: id2 

    Member<Integer> mInteger = new Member<Integer>(1); 
    mInteger.setId(2); 
    System.out.printf("id after setting id: %d%n", mInteger.getId()); 
    //output: id after setting id: 2 
} 

现在你现在要找什么,我相信你会找到你的问题的最佳解决方案。

退房: http://download.oracle.com/javase/tutorial/java/generics/index.html http://en.wikipedia.org/wiki/Generics_in_Java

...

0

嗯,我也想知道以下块写道。我认为instanceof更好,但我试过getclass。

公共静态无效的主要(字串[] args){

System.out.println(method("This is a test")); 
} 


private static String method(Object o){ 
      System.out.println(o.toString()); 
    String status = ""; 
    String className; 
    String[] oList = {"Double","Integer","String","Double","Float","Byte","Short","Long","Character","Boolean" }; 

    for(int i = 0;i<oList.length;i++){ 

     className = "java.lang." + oList[i]; 
     Class testClass; 
     try { 
      testClass = Class.forName(className); 
      if(o.getClass().equals(testClass)){ 

       status = "Your object is " + oList[i]; 


      } 
     } catch (ClassNotFoundException e) { 

      e.printStackTrace(); 
     } 

    } 


    return status; 

} 
0

您可以使用 “散列适配器” 的格局。

Public interface Adapter { 
    Public void handle(object o); 
} 

Public class StringAdapter implements Adapter { 
    Public void handle(String st) { // stuff ... 
} 

Public class IntegerAdapter implements Adapter { 
    Public void handle(Integer intgr) { // stuff ... 
} 

Private static final Map adapters = new HashMap(); 
Adapters.put(string.class, new stringAdapter()); 
Adapters.put(Integer.class, new IntegerAdapter()); 

Public void handleMe(Object o) { 
    Adapters.get(o.getClass()).handle(o); 
} 

我一直喜欢这个比ol级联的ifs和else's更多。

在我的iPad上对格式化和简洁以及拼写感到抱歉。

相关问题