V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  nothingistrue  ›  全部回复第 102 页 / 共 109 页
回复总数  2174
1 ... 94  95  96  97  98  99  100  101  102  103 ... 109  
2022-06-13 12:57:07 +08:00
回复了 ak1ak 创建的主题 Java 关于 Java 泛型方法定义的疑惑
运行起来才发现怪怪的,楼主定义的 Util 是个函数式接口,但它的具体方法又继续用函数式接口,这样嵌套下来的场景,貌似我不好举例。所以就把 Util 换成工具类了。然后实际运行中,静态方法无法使用模板参数,所以 Util 又给改成对象类型的。

代码看上面,最终的效果是。A2 的工具类,可以从 A3 的 List 中做读方向处理,可以往 A1 的 List 中做写方向处理。

对于楼主 1 楼的需求,如果是这样,Util 类是个函数式接口,模板参数是“A3 的父类”,这是绝对不行的,因为这样的效果等同于方法的形参定义成了“某某或它的父类”,而这是违反面向对象基本原则的。如果是这样,Util 类是带模板参数的普通类,它的其中一个方法的参数限制为“模板参数的父类”,这是可以的,实际效果就看我上面的代码。
2022-06-13 12:40:50 +08:00
回复了 ak1ak 创建的主题 Java 关于 Java 泛型方法定义的疑惑
class Scratch {
public static void main(String[] args) {
Util<A2> util = new Util<>();

List<A3> a3List= new ArrayList<>();
util.getAndProcess(a3List,a3 -> {return true;});

List<A1> a1List = new ArrayList<>();
util.supplyAndSet(a1List,A2::new );
}
}

class Util<T> {
public List<? extends T> getAndProcess(List<? extends T> list, Function<T, Boolean> function) {
list.forEach(e->function.apply(e));
return list;
}

public List<? super T> supplyAndSet(List<? super T> list, Supplier<T> supplier) {
list.add(supplier.get());
return list;
}
}


class A1 {
}

class A2 extends A1 {
}

class A3 extends A2 {
}
2022-06-13 11:38:47 +08:00
回复了 ak1ak 创建的主题 Java 关于 Java 泛型方法定义的疑惑
interface Util2<T> {
void process(List<? super T> list, Function<T, Boolean> function);
}
2022-06-13 11:09:54 +08:00
回复了 ak1ak 创建的主题 Java 关于 Java 泛型方法定义的疑惑
泛型必须有泛型参数,或者模板参数,这样才能在使用的时候将模板参数替换成实际内容。你标题里面的定义缺少了模板参数,这样定义的时候没问题,但是使用的时候因为没有传递模板参数(也无法传递)导致没法替换。换成你回复里面的定义方式,加上了模板参数,这样使用的时候 “Util<A1> util” 这就把 A1 这个参数传进去了,就能用。
2022-06-10 17:21:48 +08:00
回复了 HeFengzz 创建的主题 程序员 你的文件和目录的命名习惯是怎样的?
普通文件和目录,这是给自己看的(如果是团队共享目录,也是给团队的人看的),就别搞那么多条条道道了,直接自然语义命名,为了避免碰到旧(弱智)软件的麻烦,最多用横杠(比下划线更容易输入)代替空格。
2022-06-10 14:56:18 +08:00
回复了 rqxiao 创建的主题 Java 对 Java 之泛型通配符 ?extends T 的认知 和 ? super T 一些疑惑
List<? extends Fruit> upper , 向上造型通配符,可以使用其“方法返回类型限定”的方法(例如 get 方法),不能使用其“方法参数类型限定”的方法(例如 add 、set 方法)。可以这样使用 upper.get(),得到的一个可以向上造型到 Fruit 的对象——即 Fruit 或者它的子类的对象。不能使用 upper.add (someObjectInstanceFruit)。

List<? super Apple> downer ,向下造型通配符,可以使用其“方法返回类型限定”的方法(例如 get 方法), >>>但是只能得到 Object 类型的返回类型<<< ;可以使用其“方法参数类型限定”的方法(例如 add 、set 方法),但参数类型只能是类型参数(或者其 >>>子类<<< )。downer.get() 的返回类型只能是 Object 。 可以使用 downer.add ( someObjectInstanceApple )。

另外需要注意一点,通配符是用来限定声明变量赋值的,不是用来限定声明完成之后的使用的,上面说的两点其实是被动的的使用限制,而不是主动的类型限定。这正的限定是:
List<? extends Fruit> 限定了只能将 new ArrayList<Fruit 的子类>() 赋值给它。
List< ? super Apple> 限定了只能将 new ArrayList<Apple 的父类>() 赋值给它。
2022-06-10 14:40:40 +08:00
回复了 rqxiao 创建的主题 Java 对 Java 之泛型通配符 ?extends T 的认知 和 ? super T 一些疑惑
关于通配符,我去拔了下我的笔记,发现了这句话:
如果你想从一个数据类型里获取数据,使用 ? extends 通配符
如果你想把对象写入一个数据结构里,使用 ? super 通配符
如果你既想存,又想取,那就别用通配符。

? extends 、? super 这里是通配符,不是继承关系,前者是向上造型通配符,后者是向下造型通配符。
2022-06-10 14:30:18 +08:00
回复了 rqxiao 创建的主题 Java 对 Java 之泛型通配符 ?extends T 的认知 和 ? super T 一些疑惑
? extends T 跟 ? super T 都是编译擦除法下实现泛型的折衷方法,并不完美。另外它们的实际含义不是 T 的子类、T 的父类。
2022-06-10 14:25:02 +08:00
回复了 rqxiao 创建的主题 Java 对 Java 之泛型通配符 ?extends T 的认知 和 ? super T 一些疑惑
你这个疑问,起始不止跟泛型有关,还跟 Base base = new AnyChild() 多态有关。

如果没有泛型(或者说完美的泛型),应该是这样的多态,List<Fruit> fruits = new ArrayList(); ruits.add(new Apple()); fruits.add(new Banana);。但是 Java 的泛型不是完美的泛型,用得是编译擦除,所以实现不了上面的效果。因为泛型仅存在于编译时,运行时被擦除了,运行时的 fruits 就是个 List<?>,你给他 add 啥都可以。
@IAmAnonymous 楼主已经隐藏发帖记录了。

2000 的 CPU ,配不上超万的总价;超万的总价,还用了大量杂牌:这个配置是闹着玩的。
2022-06-10 11:56:23 +08:00
回复了 ternencehou 创建的主题 Java 在 Java 代码里怎么保留字符串的原格式。
C#那个用法,本质上是写的时候不写 \n ,但通过特殊标记,编译的时候自动加上\n ,这是语法糖。Java ,至少是 Java 8 及之前,对语法糖极为谨慎(甚至是排斥)。
2022-06-10 09:39:31 +08:00
回复了 vimac 创建的主题 iDev 关于 App Store 要求 APP 必须提供用户彻底删除的功能的一个问题
老外的惯例是,用户数据必须立刻删除,用户标识可以延后解绑(延后期限也没硬性要求,3 个月行,12 个月行,24 个月也行)。注意用户标识是解绑不是删除,也就是说到期后要满足这个标识不会定位到之前的人,但这个标识可以留着当历史数据用(当然像身份证号这种必定关联自然人的标识,那就必须删除了)。要是立刻解绑用户标识,被薅羊毛只是小问题,对系统数据逻辑的冲击才是致命的。

硬删除跟软删除,在大数据分析或者商务意义上,没有区别。软删除留下来的数据,你要用在除了误删除恢复的其他场景下,那绝对被揍到爆,你要是不用,那这数据就是垃圾数据。
看电影专用的,不能当电脑屏幕,标准不一样。投影仪可能比电视会好点,但肯定还是不如电脑屏幕。
2022-06-09 13:42:13 +08:00
回复了 rophie123 创建的主题 Android 2022 年了,安卓消息推送还需要挂后台?
Andorid 不挂后台,就不能接受推送,即使是用 GMS 也一样。但是,Andorid 是真后台,设计良好的应用,永久挂后台,是不费电的。
2022-06-09 09:50:11 +08:00
回复了 wsrlyk 创建的主题 Android 无法更新 Chrome (和 WebView)
webview 是个特殊的应用,它本质上是系统底层组件而不是应用程序,更新不了算是日常。另外 PlayStore 的最佳用法是静默更新——啥都不管让它自己去鼓捣,不需要手动去管理更新。
2022-06-09 09:35:17 +08:00
回复了 Livid 创建的主题 Atom GitHub 宣布会放弃 Atom 项目
@thtznet #8 你要这样认为,那你很适合用记事本( windows 自带那个记事本)编码。
2022-06-09 09:20:19 +08:00
回复了 yongdongjino3 创建的主题 程序员 怎样才能快速增加项目经验?
HR 的话,别信。

你实际上是找工作经验少,找的多了就知道,假如 HR 这样跟你谈,那说明你对于这个岗位来说至少是可有可无的,大概率还是准备用完即弃的。
2022-06-08 14:02:09 +08:00
回复了 leeqingshui 创建的主题 Java 数据库保存或更新返回值的问题, void or int ?
全 ORM 的惯例是:
保存(新增或修改)返回修改后的实体;
单独的新增方法返回新增后的实体或者主键;
单独的增量修改方法返回修改后的实体或者主键;
删除返回删除前的重新查询的实体;
批量 /动态修改,及批量 /动态删除,返回实际受影响的行数。

惯例只是惯例,是否遵循取决于自身得需要。但是,绝对不能为了代码美观而不要返回值。
2022-06-08 12:34:41 +08:00
回复了 frank1256 创建的主题 Java Java 线程池使用 Future,任务没完成啥意思
我看了回复才发现你任务队列长度是 1 ,那一次性提交 10 个任务,出错是正常的,不出错才有问题。

这个 ThreadPoolExector ,Executor 执行器才是关键,ThreadPool 线程池只是执行器的一种实现方式(虽然 Java 就这一种实现方式,但其他语言会有其他方式)。

然后你的问题,你已经回答了,call()方法执行完毕,确实不算一个任务完成。service.take()执行完成后,可以确定 call()方法执行完了,通常也代表任务执行完了,但是执行器内部有没有把任务标记为完成,就不好说了,一般会有少量的延迟。

最后,我看了一下你的错误信息,里面有这么一句:

.ThreadPoolExecutor@2133c8f8[Running, pool size = 10, active threads = 2, queued tasks = 0, completed tasks = 10]

注意这个 active threads = 2 ,第一个 10 个任务完成之后,执行器有可能做优化了,就留 2 个线程,毕竟你队列长度是 1 ,2 个线程足够了。
2022-06-08 10:26:08 +08:00
回复了 haython 创建的主题 Java Java 有类似于 Redis 锁的,只在本应用的锁吗?
你是想用缓存,还是要线程加锁,还是要利用定时自动解锁做业务逻辑。如果是线程加锁的话,用 await 、wait 、notify 这些线程通信机制来解锁会更有效,实在不行,你还可以用 sleep 。如果是另外两个场景,用 Redis ,比自己搞,更简单还更可靠。
1 ... 94  95  96  97  98  99  100  101  102  103 ... 109  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1542 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 34ms · UTC 16:39 · PVG 00:39 · LAX 08:39 · JFK 11:39
Developed with CodeLauncher
♥ Do have faith in what you're doing.