账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    java泛型的一些小问题
    22
    0

    不多说废话,先上代码

    class Apply {
        // 必须放置边界和通配符,银边使得Apply和FilledList在所有需要的情况下都可以使用,否则,下面的某些Apply和FilledList应用将无法工作。
        public static <T, S extends Iterable<? extends T>>
        /*List<Shape> shapes = new ArrayList<Shape>();
            Apply.apply(shapes, Shape.class.getMethod("rotate"));*/
        void apply(S seq, Method f, Object... args) {
            try {
                for(T t: seq)
                    f.invoke(t, args);
            } catch(Exception e) {
                // Failures are programmer errors
                throw new RuntimeException(e);
            }
        }
    }
    
    class Shape {
        public void rotate() { System.out.println(this + " rotate"); }
        public void resize(int newSize) {
            System.out.println(this + " resize " + newSize);
        }
    }
    
    class Square extends Shape {}
    
    class FilledList<T> extends ArrayList<T> {
        // 类型标记技术是Java文献推荐的技术。但是,有些人强烈地首先工厂方式
        public FilledList(Class<? extends T> type, int size) {
            try {
                for(int i = 0; i < size; i++)
                    // Assumes default constructor:
                    add(type.newInstance());
            } catch(Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    public class Chapter15_17_2 {
        public static void main(String[] args) throws Exception {
            List<Shape> shapes = new ArrayList<Shape>();
            for(int i = 0; i < 10; i++)
                shapes.add(new Shape());
            Apply.apply(shapes, Shape.class.getMethod("rotate"));
            Apply.apply(shapes,
                    Shape.class.getMethod("resize", int.class), 5);
            List<Square> squares = new ArrayList<Square>();
            for(int i = 0; i < 10; i++)
                squares.add(new Square());
            Apply.apply(squares, Shape.class.getMethod("rotate"));
            Apply.apply(squares,
                    Shape.class.getMethod("resize", int.class), 5);
    
            Apply.apply(new FilledList<Shape>(Shape.class, 10),
                    Shape.class.getMethod("rotate"));
            Apply.apply(new FilledList<Shape>(Square.class, 10),
                    Shape.class.getMethod("rotate"));
        }
    }

    经过编译发现上面这段代码是可以运行的,但是对这语句很困惑:public static <T, S extends Iterable<? extends T>>
    那位表哥能解释下具体的意思,以及泛型T是如何来进行赋值的,感激不尽

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 我帅跟我走 普通会员 1楼

      Java泛型是一种面向对象编程技术,它可以让我们在不明确参数类型的情况下使用相同的代码。以下是一些Java泛型的小问题:

      1. 泛型类型检查:在编译时,Java编译器会检查你的代码是否正确使用了泛型。如果你试图使用一个未被声明的类型,或者在一个已声明但类型不匹配的类型上使用泛型,编译器将会抛出错误。例如,以下代码将会抛出java.lang.ClassCastException

      java Person person = new Student("John", 18);

      1. 泛型数组/集合:在Java中,你可以使用泛型数组和集合,但是这些类型在声明时必须是明确的类型。例如,以下代码将会抛出java.lang.ClassCastException

      java String[] names = {"John", "Jane", "Jim"};

      1. 泛型方法:在Java中,你可以使用泛型方法来处理任意类型的参数。但是,这些方法必须在类中声明为public。例如,以下代码将会抛出java.lang.reflect.MethodException

      java public void printNames(String[] names) { for (String name : names) { System.out.println(name); } }

      1. 泛型方法参数:在Java中,你可以使用泛型方法来处理任意类型的参数,但是这些方法必须在类中声明为public。例如,以下代码将会抛出java.lang.reflect.MethodException

      java public void printNames(String[] names, String name) { System.out.println(name); }

      1. 泛型参数:在Java中,你可以使用泛型参数来处理任意类型的参数,但是这些参数必须在方法声明中声明为public。例如,以下代码将会抛出java.lang.reflect.MethodException

      java public void printNames(String[] names, String name) { for (String name : names) { System.out.println(name); } }

      1. 泛型列表/集合:在Java中,你可以使用泛型列表和集合,但是这些类型在声明时必须是明确的类型。例如,以下代码将会抛出java.lang.ClassCastException

      java List<String> names = new ArrayList<String>();

      这些问题都提醒我们,虽然Java的泛型可以帮助我们处理任意类型的参数,但是使用泛型需要谨慎,因为它可能会导致代码的难以理解和维护。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部