OPPPPOP 2010-06-12 17:17
浏览 201
已采纳

java <T> 疑问

[code="java"]
public List getValues(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
return values;
}
[/code]
这个是从一个类文件拷出来的代码
List 为什么要这样写
我感觉[code="java"]
public List getValues(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
return values;
}
[/code]
这样写就是正确的
事实拷出来的代码在新的类里确实正常
关键是在原类会报错

Multiple markers at this line
- T cannot be resolved to a type
- T cannot be resolved to a type
--Eclipse 提示
非常不理解 为什么

  • 写回答

7条回答 默认 最新

  • myali88 2010-06-13 12:58
    关注

    [quote]
    List 与List的区别
    [/quote]
    我还没说清楚吗?你不要把这两个一起比较,虽然形式上很像,但它们是两个语法类型。比较下面两个声明:
    [code="java"]
    public List getValues(Class c) throws Exception{
    List values = new ArrayList();
    T o= c.newInstance();
    values.add(o);
    return values;
    }

    public void getValues2(Class c) throws Exception{
    List values = new ArrayList();
    T o= c.newInstance();
    values.add(o);

    }
    

    [/code]
    上面的“ List”和“ void”才具有可比性,从上面可以看出表示声明泛型方法,是语法的一部分,“List”或“void”表示方法的返回类型。至于List,我想你应该知道是什么含义了,就是泛型类的语法方式。
    另外,上面这两方法可以放到任何普通类里面,不会出现任何问题。但要注意使用JDK 5及以上,还有一点,Eclipse里的编译器是可以设置JDK级别的,即使是JDK5,也可以设置为1.4的级别,所以,不要光看是相同的JDK,还要看使用编译器的级别。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • xichao007521 2010-06-12 19:37
    关注

    这是java泛型的语法啊,用之前必须在方法前定义!

    评论
  • myali88 2010-06-12 19:42
    关注

    [code="java"]
    class A {

    public <T>List<T> getValues(Class<T> c) throws Exception{
        List<T> values = new ArrayList<T>();
        T o= c.newInstance();
        values.add(o);
        return values;
    }
    
    public List<T> getValues2(Class<T> c) throws Exception{
        List<T> values = new ArrayList<T>();
        T o= c.newInstance();
        values.add(o);
        return values;
    }
    

    }
    [/code]
    像这样定义,两个都是正确的。你说的
    [quote]
    Multiple markers at this line

    • T cannot be resolved to a type
    • T cannot be resolved to a type [/quote] 只有在上面的类A定义中没有了“”时才会出现。你原类怎么定义的?
    评论
  • blacksound 2010-06-12 21:07
    关注

    在方法这里用泛型,得在返回类型前加这个符号
    可以看看thinking in java

    评论
  • xichao007521 2010-06-13 09:43
    关注

    在你没有返回值的时候,可以不用在前面定义,将方法里的改为<?>就可以了,但是这样一般没有多大意义

    评论
  • xichao007521 2010-06-13 09:45
    关注

    泛型就是你可以传入任何值,这和Object很像,不过你可以限制T的类型,比如

    评论
  • myali88 2010-06-13 11:31
    关注

    [code="java"]
    class A {
    public List getValues2(Class c) throws Exception{
    List values = new ArrayList();
    T o= c.newInstance();
    values.add(o);
    return values;
    }

    }
    [/code]
    上面这种是“generics class”,即针对类的泛型声明,泛型参数T在类的声明范围内有效。
    [code="java"]
    public List getValues(Class c) throws Exception{
    List values = new ArrayList();
    T o= c.newInstance();
    values.add(o);
    return values;
    }
    [/code]
    而这种是“generics method”,即泛型方法,“List”是可以中间分开的,写出“ List”,这样会更清楚,这个参数T则在此方法声明范围内有效。
    所以,对于泛型类中,如果没有了参数T,那么里面的方法却包含T,就会出现编译期的错误:
    [quote]
    [code="java"]
    Multiple markers at this line

    • T cannot be resolved to a type
    • T cannot be resolved to a type [/code] [/quote]
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 eclipse无法正常运行
  • ¥15 定义了函数,但是无法根据函数定义触发器
  • ¥20 5变量卡诺图化简得出与非门电路图
  • ¥20 位置依赖的碱基序列独热编码
  • ¥15 Python爬取交通拥堵指数数据
  • ¥15 使用vba抓取重定向网页问题
  • ¥20 付费需求测试程序(细谈)。
  • ¥15 为什么这段c++代码会报这么多语法错误?
  • ¥20 如何利用C语言实现用最小二乘法选配两个经验公式
  • ¥50 vue-codemirror如何对指定行 指定位置的 字符进行背景颜色或者字体颜色的修改?