泛型方法返回值问题

时间:2022-10-28 19:43:18
static void Main(string[] args)
        {
            Say<string>("abc");
        }

      
        public static T Say<T>(string str)
        {
            T t1 = default(T);
            t1 = (T)str;
            return t1;
        }

为什么一直报无法从string类型转换为T呢?
如果一个泛型方法的返回值就是T本身 而且在方法内部对传进来的参数进行操作然后返回 怎么写呢?

17 个解决方案

#1


T 有可能是任何类型,刚好你这里是用string 类型而已。

#2


如果你一定要转,那么请先转成object 再转 

public static T Say<T>(string str)
        {
            T t1 = default(T);
            t1 = (T)((object)str);
            return t1;
        }

#3


t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#4


public static T Say<T>(string str)
  {
  return  (T)Convert.ChangeType(str,typeof(T));
  }

#5


比如 Say<Int32>("123")

#6


因为T类型不确定,所以不能直接用(T)转换类型,.Net不能确定T是什么,也无法确定string是否能转换为T,这样转换肯定会报错,

用Convert.ChangeType试试看:

static void Main(string[] args)
   {
   Say<string>("abc");
   }

     
  public static T Say<T>(string str)
   {
   T t1 = default(T);
   t1 = (T)Convert.ChangeType(str,t1.GetType());
   return t1;
   }

#7


不能保证 (T)str 可以转换

#8


那应该怎么写呢?
引用 3 楼 icedmilk 的回复:
t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#9


你要实现什么功能?
为什么要用泛型?

引用 8 楼 zaonian 的回复:
那应该怎么写呢?

引用 3 楼 icedmilk 的回复:
t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#10


像你这样写 如果T是int类型 这里会报错吗?
引用 6 楼 stonespace 的回复:
因为T类型不确定,所以不能直接用(T)转换类型,.Net不能确定T是什么,也无法确定string是否能转换为T,这样转换肯定会报错,

用Convert.ChangeType试试看:

static void Main(string[] args)
  {
  Say<string>("abc");
  }

   
  public static T Say<T>(strin……

#11


这样写,如果T是int,应该不会报错,Convert.ChangeType相当于Convert.ToInt32,如果str的值不是整数可能抛异常或者返回0,

但如果T是引用类型,那么运行时会报错,

引用 10 楼 zaonian 的回复:
像你这样写 如果T是int类型 这里会报错吗?
引用 6 楼 stonespace 的回复:
因为T类型不确定,所以不能直接用(T)转换类型,.Net不能确定T是什么,也无法确定string是否能转换为T,这样转换肯定会报错,

用Convert.ChangeType试试看:

static void Main(string[] args)
{
Say<string>("abc"……

#12


我不做什么功能 就是想写个例子 返回值是T的  呵呵 你能写一个好点的好理解的例子吗
引用 9 楼 icedmilk 的回复:
你要实现什么功能?
为什么要用泛型?


引用 8 楼 zaonian 的回复:
那应该怎么写呢?

引用 3 楼 icedmilk 的回复:
t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#13


引用 4 楼 bclz_vs 的回复:
public static T Say<T>(string str)
  {
  return  (T)Convert.ChangeType(str,typeof(T));
  }


就是这个。。。

#14


泛型本身就是模板的意思,模板就是类型无关,只和算法有关,为什么要有返回值是T?

#15



        public class MyList<TElement> where TElement : class
        {
            private object[] array = new object[10];

            public int Length { get; private set; }

            public MyList() {
                Length = 0;
            }

            public void Add(TElement element) {
                if(Length + 1 > array.Length) {
                    object[] newArray = new object[array.Length + 10];
                    array.CopyTo(newArray, 0);
                    array = newArray;
                }
                Length++;
                array[Length - 1] = element;
            }

            public TElement this[int i] {
                get {
                    return array[i] as TElement;
                }
                set {
                    array[i] = value;
                }
            }
        }

#16


上来学习的

#17


引用 2 楼  的回复:
如果你一定要转,那么请先转成object 再转 

public static T Say<T>(string str)
  {
  T t1 = default(T);
  t1 = (T)((object)str);
  return t1;
  }



public class FanxingMethod {
@SuppressWarnings("unchecked")
public <T extends Object> T add(T a, T b) throws Exception {
if (a instanceof Integer && b instanceof Integer) {
Integer c = (Integer) a + (Integer) b;
return (T)((Object)c);
}else if(a instanceof String && b instanceof String){
String c = (String) a + (String) b;
return (T)((Object)c);
}else{
throw new MyException("add");
}

}

}


package pensonal.zeng;

public class FanxingMethodDemo {
public static void main(String[] args) throws Exception {
FanxingMethod fm = new FanxingMethod();
int a = fm.add(new Integer(8), new Integer(9));
System.out.println(a);
String s = fm.add("8", "a");
System.out.println(s);
}

}




呃,用这个解决自己正做的例子可以:

#1


T 有可能是任何类型,刚好你这里是用string 类型而已。

#2


如果你一定要转,那么请先转成object 再转 

public static T Say<T>(string str)
        {
            T t1 = default(T);
            t1 = (T)((object)str);
            return t1;
        }

#3


t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#4


public static T Say<T>(string str)
  {
  return  (T)Convert.ChangeType(str,typeof(T));
  }

#5


比如 Say<Int32>("123")

#6


因为T类型不确定,所以不能直接用(T)转换类型,.Net不能确定T是什么,也无法确定string是否能转换为T,这样转换肯定会报错,

用Convert.ChangeType试试看:

static void Main(string[] args)
   {
   Say<string>("abc");
   }

     
  public static T Say<T>(string str)
   {
   T t1 = default(T);
   t1 = (T)Convert.ChangeType(str,t1.GetType());
   return t1;
   }

#7


不能保证 (T)str 可以转换

#8


那应该怎么写呢?
引用 3 楼 icedmilk 的回复:
t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#9


你要实现什么功能?
为什么要用泛型?

引用 8 楼 zaonian 的回复:
那应该怎么写呢?

引用 3 楼 icedmilk 的回复:
t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#10


像你这样写 如果T是int类型 这里会报错吗?
引用 6 楼 stonespace 的回复:
因为T类型不确定,所以不能直接用(T)转换类型,.Net不能确定T是什么,也无法确定string是否能转换为T,这样转换肯定会报错,

用Convert.ChangeType试试看:

static void Main(string[] args)
  {
  Say<string>("abc");
  }

   
  public static T Say<T>(strin……

#11


这样写,如果T是int,应该不会报错,Convert.ChangeType相当于Convert.ToInt32,如果str的值不是整数可能抛异常或者返回0,

但如果T是引用类型,那么运行时会报错,

引用 10 楼 zaonian 的回复:
像你这样写 如果T是int类型 这里会报错吗?
引用 6 楼 stonespace 的回复:
因为T类型不确定,所以不能直接用(T)转换类型,.Net不能确定T是什么,也无法确定string是否能转换为T,这样转换肯定会报错,

用Convert.ChangeType试试看:

static void Main(string[] args)
{
Say<string>("abc"……

#12


我不做什么功能 就是想写个例子 返回值是T的  呵呵 你能写一个好点的好理解的例子吗
引用 9 楼 icedmilk 的回复:
你要实现什么功能?
为什么要用泛型?


引用 8 楼 zaonian 的回复:
那应该怎么写呢?

引用 3 楼 icedmilk 的回复:
t1 = (T)str;
这一句,你当然无法保证str能转换成功,
T如果是int呢

这函数逻辑就不对

#13


引用 4 楼 bclz_vs 的回复:
public static T Say<T>(string str)
  {
  return  (T)Convert.ChangeType(str,typeof(T));
  }


就是这个。。。

#14


泛型本身就是模板的意思,模板就是类型无关,只和算法有关,为什么要有返回值是T?

#15



        public class MyList<TElement> where TElement : class
        {
            private object[] array = new object[10];

            public int Length { get; private set; }

            public MyList() {
                Length = 0;
            }

            public void Add(TElement element) {
                if(Length + 1 > array.Length) {
                    object[] newArray = new object[array.Length + 10];
                    array.CopyTo(newArray, 0);
                    array = newArray;
                }
                Length++;
                array[Length - 1] = element;
            }

            public TElement this[int i] {
                get {
                    return array[i] as TElement;
                }
                set {
                    array[i] = value;
                }
            }
        }

#16


上来学习的

#17


引用 2 楼  的回复:
如果你一定要转,那么请先转成object 再转 

public static T Say<T>(string str)
  {
  T t1 = default(T);
  t1 = (T)((object)str);
  return t1;
  }



public class FanxingMethod {
@SuppressWarnings("unchecked")
public <T extends Object> T add(T a, T b) throws Exception {
if (a instanceof Integer && b instanceof Integer) {
Integer c = (Integer) a + (Integer) b;
return (T)((Object)c);
}else if(a instanceof String && b instanceof String){
String c = (String) a + (String) b;
return (T)((Object)c);
}else{
throw new MyException("add");
}

}

}


package pensonal.zeng;

public class FanxingMethodDemo {
public static void main(String[] args) throws Exception {
FanxingMethod fm = new FanxingMethod();
int a = fm.add(new Integer(8), new Integer(9));
System.out.println(a);
String s = fm.add("8", "a");
System.out.println(s);
}

}




呃,用这个解决自己正做的例子可以: