interface  IMessage{
public void send(String str);
}
class MessageImpl implements  IMessage{
public void send(String str){
System.out.println("---"+str);
}
}
class Factory{
public <T>T getInstance(String Classname){
    if("MessageImpl".equalsIgnoreCase(Classname)){
        return   new  MessageImpl<T>();
    }
else
return null;
}
}
public class B{
public static void main(String args[]){
    IMessage msg=Factory.getInstance("MessageImpl");
}

解决方案 »

  1.   

    一定要用T么?public class GernericityTest {
        public static void main(String args[]){
            IMessage msg = Factory.getInstance("MessageImpl");
            if(msg != null) {
                msg.send("aaa");
            }
        }
    }interface IMessage{
        void send(String str);
    }class MessageImpl implements  IMessage{
        public void send(String str){
            System.out.println("---"+str);
        }
    }class Factory{
        public static IMessage getInstance(String Classname){
            if("MessageImpl".equalsIgnoreCase(Classname)){
                return new MessageImpl();
            }
            else
                return null;
        }
    }
      

  2.   

    package test.gt80;interface IMessage {
    public void send(String str);
    }class MessageImpl implements IMessage {
    public void send(String str) {
    System.out.println("---" + str);
    }
    }class Factory {
    public static<T> T getInstance(String Classname, Class c) {
    if ("MessageImpl".equalsIgnoreCase(Classname)) {
    return (T)new MessageImpl();
    } else
    return null;
    }
    }public class B {
    public static void main(String args[]) {
    IMessage msg=Factory.getInstance("MessageImpl", IMessage.class);
    }
    }
      

  3.   

    可以问下那个工厂类里面形式参数加的class  c  还有主方法里面调用get instance方法里面的IMessage. class是什么意义吗,不太懂谢谢
      

  4.   

    有必要用泛型吗,直接用接口类型不就好了,不管是什么实现类,都是接口类型,不明白你的需求
    public IMessage getInstance(String Classname)
      

  5.   

    好吧,还是没明白,看我的理解是不是正确。
    先定义一个生产对象类的接口public interface Imessage{
            public void send();    
    }然后是几个实现该接口的子类public class Message1 implements Imessage{
            public void send(){
                    System.out.println("子类1");
            }

    public class Message2 implements Imessage{
            public void send(){
                    System.out.println("子类2");
            }
    } 然后创建工厂类MessageFactory,getInstance方法创建相应类的实例public class MessageFactory{
            public <T extends Imessage> T geInstance(Class<T> t){
                    Imessage message=null;
                    try{
                            message=(Imessage)Class.forName(c.getName()).newInstance();                            
                     }catch (InstantiationException e){
                              e.printStackTrace();
                      }catch(IllegalAccessException e){
                              e.printStackTrace();
                       }catch(ClassNotFoundException e){
                              e.printStackTrace();
                       }
                       return (T)message;
             }}在测试类里用工厂类的getInstance分别创建两个类的实例,调用相应的send方法查看效果public class Test{
            public static void main(String[] args){
                    MessageFactory f=new MessageFactory();
                    Imessage m1=f.getInstance(Message1.class);
                    Imessage m2=f.getInstance(Message2.class);
                    m1.send();
                    m2.send();
            }
    }不出意外,第一行输出"子类一",第二行“子类二”。
      

  6.   

    可以问下那个工厂类里面形式参数加的class  c  还有主方法里面调用get instance方法里面的IMessage. class是什么意义吗,不太懂谢谢就是一种不太常见的语法。编译器无法通过你的这种写法推出你的类型,需要用class指定一下。
      

  7.   

    可以问下那个工厂类里面形式参数加的class  c  还有主方法里面调用get instance方法里面的IMessage. class是什么意义吗,不太懂谢谢
    class是我忘了删了,可以省略
    public static<T> T getInstance(String Classname) {
    if ("MessageImpl".equalsIgnoreCase(Classname)) {
    return (T)new MessageImpl();
    } else
    return null;
    }
      

  8.   

    再走一波class Factory2{
        @SuppressWarnings("unchecked")
        public static <T> T getInstance(Class<T> cls){
            try {
                return (T)Class.forName(cls.getCanonicalName()).newInstance();
            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    IMessage msg = Factory2.getInstance(MessageImpl.class);